【发布时间】:2011-11-23 04:22:24
【问题描述】:
我想知道是否有任何方法可以将一个函数传递给另一个函数来处理它的 try/catch。我正在处理没有任何异常处理的现有代码库。
【问题讨论】:
-
我认为这个问题的答案类似于Aspect Oriented Programming。看看PostSharp。
标签: c# exception-handling anonymous-methods
我想知道是否有任何方法可以将一个函数传递给另一个函数来处理它的 try/catch。我正在处理没有任何异常处理的现有代码库。
【问题讨论】:
标签: c# exception-handling anonymous-methods
注意:此答案针对的是问题的文本而不是标题,因为问题似乎与将函数作为参数传递无关。
确切地知道您要做什么有点困难,但您当然可以在自己的 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
}
}
你不能做的*是将错误处理添加到对该函数的现有调用。
您也许可以添加一些高级错误处理,至少让您有机会记录异常并向您的用户展示更优雅的失败体验。
*不合理
【讨论】:
查看Actions。它们将允许您将匿名方法作为参数传递。
但是,我认为这不会帮助您解决问题。您可能想要重构代码库以进行适当的异常处理。
【讨论】:
您可以使用 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
函数代理
【讨论】: