我正在尋找一種「優雅」的方式來在調用方法時抑制異常。如何將錯誤隱藏到C#中的方法調用中?
我認爲下面的代碼是太冗長:
try
{ CallToMethodThatMayFail(3); }
catch {}
有一些語法糖,我可以用說:「我真的不關心如果此方法失敗」?我想調用該方法並繼續執行,無論該方法發生了什麼。
我正在尋找一種「優雅」的方式來在調用方法時抑制異常。如何將錯誤隱藏到C#中的方法調用中?
我認爲下面的代碼是太冗長:
try
{ CallToMethodThatMayFail(3); }
catch {}
有一些語法糖,我可以用說:「我真的不關心如果此方法失敗」?我想調用該方法並繼續執行,無論該方法發生了什麼。
這是很少忽略/吞下錯誤個好主意......
要允許重新使用,你唯一的選擇是類似的方法,它接受一個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
本地...
我不知道什麼更簡潔。我想你可以做一些AOP或者更類似的東西。
是啊,AOPish是我的想法。我只是不知道該怎麼做。 – 2009-06-30 20:46:48
Something AOPish ... http://www.postsharp.org/ – 2009-06-30 20:51:00
(-1)「我不知道」並沒有真正的幫助。 「假設你可以這樣做」並不是真正的答案。 – DevinB 2009-06-30 21:05:08
都能跟得上,這是它。
這是一件很好的事情,它是冗長的。如果你壓制一個可能的異常,你最好有一個很好的理由。詳細程度將幫助您或下幾個月查看代碼的人。
不,沒有更好的方法來做到這一點,並有一個很好的理由。你看到的例外可能意味着超過「方法失敗」。這可能意味着「系統失敗」。
你可能至少應該記錄失敗的事實,以防萬一事情變得很重要。
使用城堡,你可以做這樣的事情:
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 {
}
但你真的可能不應該。
你爲什麼說這太冗長了?如果您嘗試保存鍵擊,則可以使用代碼片段。如果你關心可讀性,那麼我認爲AOP方法對另一個維護者(至少最初)不太清楚,對我而言,這比冗長度更重要。
.Net約定是類實現一個TryCallMayFail()方法和一個CallMayFail()方法,調用者選擇使用哪一個,但TryCallMayFail()方法將包含您在那裏的確切內容。
聽起來像你想討厭的VB像在C#錯誤恢復下一個功能! – RichardOD 2009-06-30 20:47:30
我認爲這可能是你可以得到的優雅。傳遞給函數來處理錯誤可能會更混亂。 我不會依靠錯誤處理來忽略錯誤。我會建議測試你想要忽略的預期錯誤情況,並在你的代碼中處理它。提升異常比條件語句在性能方面更爲昂貴。 – 2009-06-30 20:55:38
我想指出,當這是一個好主意時,每個人都有小衆情景。像今天一樣,我不得不修改一些讀取動態創建的數據網格的代碼,這些數據網格只需根據SQL VIEW中的行名創建列。偶爾,VIEW會被更改,並且在代碼中可以正常工作,但這個視圖也可能在其他地方使用。對於這個網頁,我需要以某種方式命名的列,但是如果將來有人更改VIEW,我不希望代碼打破。 – TravisO 2013-01-29 15:32:39