请考虑以下代码:
public void RunScriptBuild()
{
try
{
_helper.RunScriptBuild(); //throws FileNotFoundException
}
catch (Exception ex)
{
LogException(ex);
}
}
private void LogException(Exception ex)
{
//write to log file
ExceptionPolicy.HandleException(ex, "Logging Policy");
}
这非常好用,我可以将大量信息写入我的日志文件。 相反,我的实际代码如下:
public void RunScriptBuild()
{
RunAction(_helper.RunScriptBuild);
}
private void RunAction(Action task)
{
try
{
task(); //still throws FileNotFoundException
}
catch (Exception ex)
{
LogException(ex);
}
}
private void LogException(Exception ex)
{
//doesn't write to log file
ExceptionPolicy.HandleException(ex, "Logging Policy");
}
所以现在调用RunAction
并抛出错误时,没有任何内容写入我的日志文件。单步执行它,LogException
会被调用,我可以毫无问题地跨过它。我无法进入HandleException,因为它是MS企业应用程序块的一部分。但是我的老板不喜欢我这样做,并说我需要使用更通用的方法,因为它们更灵活,并且在这里提出了第二个代码块。
我只是看了MSDN - How to Handle Exceptions thrown by Tasks,但对我帮助不大。我正在使用.NET 3.5,因此我没有可用的AggregateExceptions。似乎找不到“如何处理行动引发的异常”......
答案 0 :(得分:1)
这与从委托中抛出异常的事实无关。
这可能与你正在调用一个不同的实际方法这一事实有关,可能导致抛出不同的异常,因此处理方式不同,或者可能是某些更改,可能是环境因素导致异常处理程序在这两种情况下采取不同的行动,由于某种原因完全没有使用代理而不是直接的方法调用。