2016-09-27 21 views
-2

我有我的模型類的構造函數可以拋出異常:例外或投入建設?

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)); 
} 

所以我的問題是,我要趕上我的例外,在構造函數或在對象初始化的那一刻?我很新手,所以我真的需要你的幫助。

+0

我不知道這是否是正確的例外的地方。這實際上取決於你將要處理的異常,但是我個人會在創建對象時而不是在構造函數中更高一步。 –

+0

損壞檢查異常的另一個例子是編碼。他們應該改善它。 –

+0

您正在穿透層邊界。模型不應該主動訪問服務層,它應該是一個被動的組件,可以將數據推送到它。 –

回答

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); 
    } 
} 
1

在你的特例中,異常處理應該不是BookModel的構造函數的一部分。 我假設你想創建一個有效的Book對象和作者姓名的BookModel實例。因此,我將修改構造成類似

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); 
}