2011-11-23 228 views
-1

我想知道是否有任何方法將函數傳遞給另一個函數來處理try/catch。我正在研究沒有任何異常處理的現有代碼庫。如何傳遞函數作爲參數?

+0

我覺得這個問題回答沿[面向方面編程]的線謊言(http://en.wikipedia.org/wiki/Aspect-oriented_programming)。看看[PostSharp](http://www.sharpcrafters.com/)。 – Ahmad

回答

2

注:此回答解決問題,而不是標題的文本,因爲這個問題似乎並沒有與傳遞函數作爲參數做。

確切地知道你想要做什麼有點困難,但你肯定可以在你自己的try…catch塊中調用公共方法。

public void ExistingMethod() 
{ 
    // bad code 
    // bad code 
    throw new NullReferenceException("The previous developers are always the problem."); 
} 

… 

public void MyMethod(ComponentFromOldCode component) 
{ 
    try 
    { 
     component.ExistingMethod(); 
    } 
    catch (NullReferenceException nre) 
    { 
     // do something 
    } 
    catch (Exception ex) 
    { 
     // do something 
    } 
} 

你無法做的*是將錯誤處理添加到對該函數的現有調用中。

您可以改爲添加一些高級錯誤處理,這至少會讓您有機會記錄異常並向用戶顯示更優雅的失敗體驗。

*不能合理

+0

神奇的例外文本,先生。 A +。 –

0

查找到Actions。他們將允許您將匿名方法作爲參數傳遞。

但是,我不認爲這會幫助你解決你的問題。您可能要重構代碼庫以進行適當的異常處理。

0

您可以使用Lambda表達式

class Program 
{ 
private static int Sum(int a, int b) 
{ 
    return a + b; 
} 

private static int Multiply(int a, int b) 
{ 
    return a * b; 
} 


private static int GetResult(Func<int, int, int> solver, int a, int b) 
{ 
    try { 
     return solver(a, b); 
    } catch { 
    } 
    return 0; // your default return 
} 

static void Main(string[] args) 
{ 
    var a = 2; 
    var b = 3; 

    var sum = GetResult(Sum, a, b); 
    var multiply = GetResult(Multiply, a, b); 
} 

Lambda表達式(C#編程指南)

http://msdn.microsoft.com/en-us/library/bb397687.aspx

Func鍵代表

更多信息

http://msdn.microsoft.com/en-us/library/bb549151.aspx