2011-11-23 177 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