C# visual studio无法检测代码返回路径
当重构一些代码时,我经历了一段时间,也许我是瞎子,但我不明白为什么下面的代码不能工作C# visual studio无法检测代码返回路径,c#,visual-studio-2010,exception,C#,Visual Studio 2010,Exception,当重构一些代码时,我经历了一段时间,也许我是瞎子,但我不明白为什么下面的代码不能工作 public bool Foo() { try { return SomeFunctionMightThrow(); } catch (Exception ex) { Logger.log(ex); throw ex; } } 到目前为止还不错,如果我重构代码 public bool Foo() { try
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;
}
代码现在不编译。编译器没有考虑到您的
loganthrow()
方法总是会抛出异常-在这种情况下,Foo()
中的所有代码路径都必须返回布尔值,因此您可以执行以下操作:
public bool Foo()
{
try
{
return SomeFunctionMightThrow();
}
catch (Exception ex)
{
LogAndThrow(ex);
return false; //will never get here
}
}
总的来说,既然你无论如何都会抛出,我建议在你的应用程序中的一个中心点使用
try/catch
块进行日志记录,即在最高级别,除非你真的可以处理异常-看起来你不在这里。你可能会将其更改为
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
}
我假设您只是将此作为一个示例,这样您就知道永远不应该使用
throw-ex代码>那样吗?是的,这个例子只是显示VS无法检测代码返回路径。约翰·桑德斯,你现在让我好奇了。我不是一个很有经验的程序员,所以你能详细说明你的评论吗?为什么不应该使用抛出ex
那样,应该如何使用?@xbonez如果你发现一个捕获的异常,你应该使用throw;(即,没有变量)而不是抛出ex@JohnSaunders+1,我甚至没有想到这一点,我是盲目地从新的SomeOtherException(“出了问题!”,ex)中“简化”代码的;在我看来,死代码是不好的,它会使代码读取器感到困惑,甚至是IDE的错。代码已经被简化,你可以告诉我,只是为了显示我所问的确切问题。@Yuan:问题仍然存在-你不应该在每个方法中触发异常日志记录,在更高的级别上执行一次,在代码中乱扔try/catch块也同样糟糕。你怎么知道我在每个级别都记录异常?为什么Foo()不是我的最高级别?因为Foo()
返回bool?当然它是从某个地方调用的。如果Foo()在WCF服务类中并由WCF客户端调用呢?谢谢,这就是我想要的。