【问题标题】:Exception or throwing in construcor? [duplicate]异常或抛出构造函数? [复制]
【发布时间】:2016-09-27 18:49:02
【问题描述】:

我的模型类带有可以抛出异常的构造函数:

public class BookModel {

private Book book;
String authorName;

public BookModel(Book book) {
    this.book = book;
    try {
        this.authorName = (AuthorLocalServiceUtil.getAuthor(book.getAuthorId())).getAuthorName();
    } catch (PortalException | SystemException e) {
        e.printStackTrace();
    }
}

之后,我在这里创建新对象:

for (Book book: bookList) {
        books.add(new BookModel(book));
}

所以我的问题是,我应该在构造函数中还是在对象初始化时捕获我的异常?我是新手,所以我真的需要你的帮助。

【问题讨论】:

  • 我不知道这是否是例外的正确位置。这实际上取决于您要如何处理异常,但我个人会在创建对象时而不是在构造函数中捕获它。
  • 另一个例子是检查异常对代码造成的损害。他们应该改进它。
  • 你在这里穿透了层边界。模型不应该主动访问服务层,它应该是一个将数据推送到其中的被动组件。
  • @MarkoTopolnik 那我该怎么办?

标签: java constructor exception-handling liferay


【解决方案1】:

BookModel 构造函数应该抛出异常。通过将异常记录在构造函数中“吞下”异常并继续执行,如果没有任何问题可能会导致错误。

如果您认为这些异常不太可能发生,或者您认为下游调用者不太可能处理这些异常,您可以将它们包装在 RuntimeException 中,这样您就不必在构造函数的签名中宣传它们。

public BookModel(Book book) {
    this.book = book;
    try {
        this.authorName = (AuthorLocalServiceUtil.getAuthor(book.getAuthorId())).getAuthorName();
    } catch (PortalException | SystemException e) {
        throw new RuntimeException(e);
    }
}

【讨论】:

    【解决方案2】:

    在你的特殊情况下,异常处理不应该是 BookModel 的构造函数的一部分。 我假设您想创建一个具有有效Book 对象和作者姓名的BookModelinstance。所以我会将构造函数修改为类似

    public BookModel(final Book book, final String authorName) {
    

    对于您尝试检索作者姓名的每个Book 对象。如果检索出现问题,则进入 catch-block。所以我会这样尝试:

    for (final Book book: bookList) {
      String authorName =null;
      try {
         authorName = (AuthorLocalServiceUtil.getAuthor(book.getAuthorId())).getAuthorName();
    
      } catch (YourException exception){
         ...logging, exception handling continue in loop,...
      }
      BookModel model = new BookModel(book, authorName);
      books.add(model);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-07-11
      • 1970-01-01
      • 2014-08-12
      • 2011-11-04
      • 2020-01-21
      • 2014-11-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多