2012-03-21 55 views
4

我有一個方法Foo()做了一些艱苦的工作,並在UI層我有一個按鈕來調用該方法。
我想要做的就是調用方法並顯示一個消息框,如果Foo()方法有問題。返回元組<布爾,字符串>而不是拋出異常()?

我有兩個選擇設計方法的簽名:

1.Tuple

Tuple<bool, string> Foo() 
{ 
    if(!DoHardWorkA()) return Tuple.New(false, "cannot do hardwork A"); 
    if(!DoHardWorkB()) return Tuple.New(false, "cannot do hardwork B"); 

    return Tuple.New(true, String.Empty); 
} 

2.Exception

void Foo() 
{ 
    if(!DoHardWorkA()) throw new ProgramSpecificException("cannot do hardwork A"); 
    if(!DoHardWorkB()) throw new ProgramSpecificException("cannot do hardwork B"); 

    return Tuple.New(true, String.Empty); 
} 

兩者DoHardWorkA()和DoHardWorkB()是外部方法那我沒有控制他們,他們返回真/假表明結果。

從邏輯上說,我認爲我應該選擇2,因爲它們確實是例外;但爲了一致性,我想選擇1.

您更喜歡哪一個,爲什麼?

+0

這是C#去了?你應該用你使用的語言來標記你的問題。 – asawyer 2012-03-21 18:10:56

+6

重要的問題是:*失敗非常罕見,或常見?*如果它非常罕見,那麼*拋出異常,然後處理它*。如果失敗很常見,那麼*返回報告失敗性質的數據*並像處理其他任何數據一樣處理數據。 – 2012-03-21 18:49:56

回答

2

拋出異常並以一致的方式處理它會更好。

如果因爲任何其他原因Foo失敗,那麼它也將被處理。假設一個scenerio。

void UIMethod() 
{ 
    Tuple<Result, Error> ret = Foo(); 
    if(ret.Error) 
    MessageBox.Show(ret.Error); 
} 

現在因爲需求的變化,你必須在Foo之前​​調用另一個方法,它也可以拋出異常。然後它變得複雜。

這樣做更容易。

void UIMethod() 
{ 
    try{ 
     MethodBeforeFoo(); 
     var ret = Foo(); 
    } 
    catch(Exception ex) 
    { 
     MessageBox.Show(ex.Message); 
    } 

} 
0

我曾經做過的事情是在失敗時成功返回null或錯誤消息。例外的是不適當的,因爲失敗是有可能和其他開發人員喜歡「的時候拋出異常中斷」

String Foo() 
{ 
    if(!DoHardWorkA()) return "cannot do hardwork A"; 
    if(!DoHardWorkB()) return "cannot do hardwork B"; 

    return null; 
} 
0

使用異常有你有可能(*)的原因更容易識別比所提出的元組的advnatage與運行返回值。爲了弄清使用元組時出現什麼樣的錯誤,你必須解釋容易出錯的字符串值。使用異常,您可以根據異常的類型確定錯誤類型。

(*)取決於如何異常使用 - 如果你扔一個通用的異常的時候,它不會是不同

當然,你可以使用一個整數的元組指示類型的問題,但錯誤類型的數值不像Exception類型那樣具有描述性(同樣,假設您沒有使用常規類型,例如Exception)。

1

這真的取決於你的需要。像這樣修改你的代碼,它也會處理未處理的異常。

Tuple<bool, string> Foo() 
{ 
try 
{ 
    if(!DoHardWorkA()) return Tuple.New(false, "cannot do hardwork A"); 
    if(!DoHardWorkB()) return Tuple.New(false, "cannot do hardwork B"); 

    return Tuple.New(true, String.Empty); 
} 
catch 
{ 
    return Tuple.New(false, "cannot do hardwork A"); 
} 

}

2

如果你正在寫你正在做的是調用這些外部方法做了一些工作,而這種方法是他們周圍的包裝,那麼爲什麼拋出一個異常,「處理」的問題在你的方法和繼續,拋出異常是很多許多倍更昂貴。

你的具體情況,你正在做的是做了一些工作,並顯示一個消息框來顯示它是否正確執行,所以我與選項1

相關問題