我在重构一些代码时经历过,也许我是盲目但我没看到为什么下面的代码不起作用。
public bool Foo()
{
try
{
return SomeFunctionMightThrow();
}
catch (Exception ex)
{
Logger.log(ex);
throw ex;
}
}
到目前为止,如果我重构代码
那么好public bool Foo()
{
try
{
return SomeFunctionMightThrow();
}
catch (Exception ex)
{
LogAndThrow(ex);
}
}
private void LogAndThrow(Exception ex)
{
Logger.log(ex);
throw ex;
}
代码现在不编译。
答案 0 :(得分:1)
编译器没有考虑到你的LogAndThrow()
方法总是会抛出异常 - 在Foo()
中的所有代码路径都必须返回一个布尔值,所以你可以< / em>就这样做:
public bool Foo()
{
try
{
return SomeFunctionMightThrow();
}
catch (Exception ex)
{
LogAndThrow(ex);
return false; //will never get here
}
}
一般情况下,无论如何,我建议您在应用中的单个中心位置使用try/catch
块进行日志记录,即在最高级别,除非您可以真正处理异常 - 看起来你不在这里。
答案 1 :(得分:1)
您可以将其更改为...
public bool Foo()
{
try
{
return SomeFunctionMightThrow();
}
catch (Exception ex)
{
// note: this will reset the exception stack trace
throw LogAndReturnException(ex);
}
}
private Exception LogAndReturnException(Exception ex)
{
Logger.log(ex);
return ex;
}
这基本上完全符合您的要求,但为VS提供了代码返回路径。
或者更简单的方法将保留堆栈跟踪,只需将捕获更改为:
catch (Exception ex)
{
Log(ex);
throw; // retains stack trace
}