2014-01-27 51 views
0

我只是問這個:Is it bad to use exceptions to end function?返回錯誤的細節無例外

現在我明白我們不應該返回異常。那麼,返回錯誤的正確方法是什麼?

當我返回一個異常,當某些事情失敗時,我知道函數內部有什麼錯誤。

但是如果是一個具有多個異常的void函數,那麼我有一個布爾函數,如果它沒有問題,則返回true;如果某個失敗,則返回false,我怎麼知道失敗的確切東西?

一個函數可能因爲多種原因失敗,所以對於我的程序來說只是一個False而已。當我用一些文本返回一個Exception時,我可以向用戶顯示確切的錯誤。

有一個字符串函數返回一個像「正確」的字或不同的錯誤看起來不是最適合我的。 什麼是推薦的方法?

+1

閱讀您以前的帖子的評論..並按照一些建議'不要使用例外來控制程序流。' – MethodMan

+0

@DJKRAZE我明白,在我之前的問題中,我不是在問同樣的事情。現在我正在做一個關於如何解決另一個(相關)問題的問題。我正在做一個新的問題,如AndréSnede Hanse在另一個問題中提出的問題。 –

+1

您可以返回枚舉而不是布爾值。如果你需要更多的信息,那麼你可以返回一個類對象而不是枚舉。這樣的類很可能開始類似於一個Exception對象。所以不,返回異常並不是錯誤的。什麼是錯誤的是打開調用者忽略它的機會,永遠不會結束。你永遠不會擔心異常處理速度很慢,對於一個程序來說它不需要做它應該做的事情需要50微秒。 –

回答

1

根據你的要求,推薦的方法會有很大的不同。

我們在一個非常大的系統中實現這一點的方法是根據需要將結構化錯誤類作爲方法的參數之一或作爲方法的返回值。

該錯誤類包含一個錯誤代碼,以便我們可以執行衆所周知錯誤的翻譯,保存用戶可使用消息的消息字符串以及可用於指示可重試性,致命性等的各種標誌。

我們在應用程序的所有級別使用此錯誤類,從我們的應用程序服務器到移動設備和Web服務方法。

這只是我們的方法,對我們來說運行良好,但是您的實施可能需要不同的方法。

2

「......我怎麼知道確切的事情失敗了?」

問這個問題可能意味着你在方法中發生了太多的事情,現在是重構的時候了。

這裏是你的榜樣,從以前的問題複製:

void Function1() 
{ 
    //Do something... 
    //If something fail 
    Throw New Exception("Fails because bla bla"); 

    //Do something... 
    //If something fail 
    Throw New Exception("Fails because bla bla bla bla"); 

    //If everything its ok, just continue without throwing anything 
} 

功能1是做了很多。爲了使維護(和測試)更容易,您可以將多組邏輯提取到不同的方法中,每個方法返回一個bool值以指示成功。

bool SomethingOne() 
{ 
    var successful = true; 

    //Do something... 
    //If something fail 
     successful = false; 

    return successful; 
} 

bool SomethingTwo() 
{ 
    var successful = true; 

    //Do something... 
    //If something fail 
     successful = false; 

    return successful; 
} 

void Function1() 
{ 
    var isOneSuccessful = SomethingOne(); 
    if (!isOneSuccessful) 
    { 
     // SomethingOne failed - do something 
     return; 
    } 

    var isTwoSuccessful = SomethingTwo(); 
    if (!isTwoSuccessful) 
    { 
     // SomethingTwo failed - do something 
     return; 
    } 

    //If everything its ok, just continue without throwing anything 
} 

YMMV。我假設「某些失敗」是一個非關鍵問題。就像也許這是一個驗證程序,你只是要顯示一條消息,說:「請檢查所有字段。」

如果是程序員使用你的方法需要特別注意和處理的東西,或者如果它是用戶必須瞭解更多的東西,一個簡單的布爾值可能不會削減它。