2009-06-30 34 views
5

我正在尋找一種「優雅」的方式來在調用方法時抑制異常。如何將錯誤隱藏到C#中的方法調用中?

我認爲下面的代碼是太冗長:

try 
{ CallToMethodThatMayFail(3); } 
catch {} 

有一些語法糖,我可以用說:「我真的不關心如果此方法失敗」?我想調用該方法並繼續執行,無論該方法發生了什麼。

+3

聽起來像你想討厭的VB像在C#錯誤恢復下一個功能! – RichardOD 2009-06-30 20:47:30

+0

我認爲這可能是你可以得到的優雅。傳遞給函數來處理錯誤可能會更混亂。 我不會依靠錯誤處理來忽略錯誤。我會建議測試你想要忽略的預期錯誤情況,並在你的代碼中處理它。提升異常比條件語句在性能方面更爲昂貴。 – 2009-06-30 20:55:38

+0

我想指出,當這是一個好主意時,每個人都有小衆情景。像今天一樣,我不得不修改一些讀取動態創建的數據網格的代碼,這些數據網格只需根據SQL VIEW中的行名創建列。偶爾,VIEW會被更改,並且在代碼中可以正常工作,但這個視圖也可能在其他地方使用。對於這個網頁,我需要以某種方式命名的列,但是如果將來有人更改VIEW,我不希望代碼打破。 – TravisO 2013-01-29 15:32:39

回答

10

這是很少忽略/吞下錯誤個好主意......

要允許重新使用,你唯一的選擇是類似的方法,它接受一個Action

static void IgnoreErrors(Action action) {try {action();} catch {}} 

可是你有沒有準確地節省了很多由你做的時間:

SomeHelper.IgnoreErrors(() => CallToMethodThatMayFail(3)); 

我只是留在原地的try/catch ...


再在評論的問題:

static void IgnoreErrors<T>(Action action) where T : Exception 
{ 
    try { action(); } catch (T) {} 
} 

SomeHelper.IgnoreErrors<ParseException>(() => CallToMethodThatMayFail(3)); 

,但我仍然會覺得更清晰有try/catch本地...

1

我不知道什麼更簡潔。我想你可以做一些AOP或者更類似的東西。

+0

是啊,AOPish是我的想法。我只是不知道該怎麼做。 – 2009-06-30 20:46:48

+0

Something AOPish ... http://www.postsharp.org/ – 2009-06-30 20:51:00

+1

(-1)「我不知道」並沒有真正的幫助。 「假設你可以這樣做」並不是真正的答案。 – DevinB 2009-06-30 21:05:08

5

都能跟得上,這是它。

這是一件很好的事情,它是冗長的。如果你壓制一個可能的異常,你最好有一個很好的理由。詳細程度將幫助您或下幾個月查看代碼的人。

0

不,沒有更好的方法來做到這一點,並有一個很好的理由。你看到的例外可能意味着超過「方法失敗」。這可能意味着「系統失敗」。

你可能至少應該記錄失敗的事實,以防萬一事情變得很重要。

4

使用城堡,你可以做這樣的事情:

public class ExceptionSuppressionInterceptor : Castle.Core.Interceptor.IInterceptor 
{ 
    public void Intercept(IInvocation invocation) 
    { 
     try { 
      invocation.Proceed(); 
     } 
     catch (Exception ex) { 
      // Suppressed! 
     } 
    } 
} 

和裝飾要取消例外像這樣的類:

[Interceptor(typeof(ExceptionSuppressionInterceptor))] 
public class GoodPracticeBreaker { 

} 

但你真的可能不應該。

0

你爲什麼說這太冗長了?如果您嘗試保存鍵擊,則可以使用代碼片段。如果你關心可讀性,那麼我認爲AOP方法對另一個維護者(至少最初)不太清楚,對我而言,這比冗長度更重要。

1

.Net約定是類實現一個TryCallMayFail()方法和一個CallMayFail()方法,調用者選擇使用哪一個,但TryCallMayFail()方法將包含您在那裏的確切內容。

相關問題