2014-06-09 88 views
2

我想寫一個擴展方法,它將運行某個對象的方法,並返回執行過程中發生的異常(如果有的話)。如何評估作爲參數傳遞給方法的Func /委託/表達式?

換句話說,使myObject.Foo()的動態爲anyObject.AnyMethod(...)。

Exception incurredException = null; 
try 
{ 
    myObject.Foo(); 
} 
catch(Exception e) 
{ 
    incurredException = e; 
} 

return incurredException; 

要這樣:

Exception e = IncurredException(() => myObject.Foo()); 

我不知道,如果一個函數功能,表達,委託等是否合適這裏。思考?謝謝!

+0

你在那裏做什麼會是最簡單的動作。在方法有返回類型的情況下,你想要做什麼? – Baldrick

回答

2

假設你不關心返回類型,你需要的東西是這樣的:

public static Exception IncurredException(Action action) 
{ 
    try 
    { 
     action(); 
    } 
    catch (Exception e) 
    { 
     return e; 
    } 

    return null; 
} 

然後,您可以調用它,你想用:

Exception e = IncurredException(() => myObject.Foo()); 

還是有點整潔,使用var和方法組語法:

var e = IncurredException(myObject.Foo); 
+0

這可能會更好地內聯'incurredException'變量,只是在那裏造成混淆。 'catch'的主體是'return e',或者更好 - 重命名'e'變量。另外,對[吞嚥**所有**](http://en.wikipedia.org/wiki/Error_hiding)給出一些描述作爲不良設計決定發生異常。 –

+0

@IlyaIvanov:同意你的內聯 - 更新。吞嚥部分不太確定嗎?我看不到有任何證據表明OP有意吞下任何例外。 – Baldrick

+0

返回一個異常並拋出它是兩種不同的情況。以前,返回值表示C或C++中可能存在的錯誤。我遠不是這方面的專家,但據我所知,這就是首先引入例外的原因。 –

相關問題