2015-07-19 211 views
2

如果您有由一羣其他對象的對象,即:優雅的方式失敗

class A{ 
    B b {get;} 
    C c {get;} 
    private A(){ 
    b = B.Make(); 
    c = C.Make(); 
    } 
} 

和類BC被設置爲返回null當拋出一個異常時,是否有更好的方法比在空成員中檢查null爲012,否則它會失敗?

誠然我的異常管理的理解很差,但它將使意義BC不處理自己的異常,而是讓他們冒泡到A,從而規避了整個空慘敗。但是,如果他們是獨立使用A的課程呢?

+0

爲什麼你想這樣做?你想要任何異常來清除所有'A's值? –

+0

如果A中的任何內容不好,A不好,那麼是的 – 2c2c

+0

你*可以*使用反射,但是這會很慢並且很糟糕。爲什麼不'''將'catch'塊內的所有值'歸零。 –

回答

1

通常應該避免根本返回null,Make()函數應該拋出異常。如果它們的例外程度太低,則應將其包裝或替換爲自定義例外。

現在,調用者(A)可以將Make()調用放置在try-catch塊中,以再次用他自己的方式替換異常,但他不需要,並且您不必處理null -checks。

0

不可否認,我對異常管理的理解很差,但B和C不應該處理他們自己的異常,而是讓他們冒泡到A,從而繞過整個空洞的失敗。但是如果他們是獨立於A的使用類呢?

如果B和C可以以有意義的方式從錯誤中恢復,那麼他們處理自己的錯誤沒有任何問題。例如,如果必須連接到服務器,並且不能這樣做,他們可以繼續嘗試而不必拋出錯誤。顯然,你需要某種方式來表明他們的連接狀態。

那麼這對於A類意味着什麼?它取決於A是否要求成功創建的B和C被認爲處於有效狀態。 如果A需要B或C,那麼在這種情況下(沒有錯誤拋出),它將由A來檢測它不處於有效狀態,並拋出(或以其他方式處理錯誤),以便創建A知道A是無效的。 如果A不需要B或C,那麼在這種情況下就像B和C一樣,你不必拋出(A是有效的),但是B和/或C是空的,你必須檢查訪問它。

底線是,B和C的行爲應該對B和C有意義。如果他們應該拋出,他們應該拋出。 然後你應該擔心A. A的行爲同樣應該是有意義的A.

你似乎擔心不必檢查空,但是你把它曾經路徑(扔,扔無),你會必須檢查東西。要麼檢查是否爲空,要麼嘗試捕獲。

你可能也想考慮重新設計A類。也許這是一個有爭議的問題。 爲什麼B和C包含在A類中?也許你可以簡單地將B和C傳遞給需要B或C的A的公共方法?