bin*_*ard 6 c# exception-handling exception
在C#中,较年轻的开发人员经常使用"throw ex"而不是"throw"来向父方法抛出异常.
示例:
try
{
// do stuff that can fail
}
catch (Exception ex)
{
// do stuff
throw ex;
}
Run Code Online (Sandbox Code Playgroud)
"throw ex"是一种不好的做法,因为堆栈跟踪被截断在失败的方法之下.因此调试代码更加困难.所以代码必须是:
try
{
// do stuff that can fail
}
catch (Exception ex)
{
// do stuff
throw;
}
Run Code Online (Sandbox Code Playgroud)
我的问题是为什么编译器授权这个(或者不显示警告信息?)是否存在"抛出ex"有用的情况?
D S*_*ley 15
是否有"抛出前"有用的情况?
当然 - 有时你想要截断堆栈跟踪 - 以避免暴露实现细节等.其他时候你可能想要抛出一个新的异常,这意味着编译器必须区别于重新抛出捕获的异常并抛出一个新的例外.
那么为什么你希望编译器阻止你做一些1)不违法的事情2)可能有用?
throw new Exception();或者throw ex;两者都将使用相同的语言规则来允许抛出异常对象(无论是新的还是现有的)。当您想要添加一些例外信息时,该选项会很有帮助。
请参阅:如何:显式引发异常 - MSDN
您可以使用 throw 语句显式引发异常。您还可以使用 throw 语句再次抛出捕获的异常。 向重新引发的异常添加信息是一种良好的编码习惯,以便在调试时提供更多信息。
由于两者都throw new Exception()需要throw ex;相同的语言规则,因此区分这两者并不是编译器的工作。
简单地抛出现有异常而不对异常对象进行任何修改将使用相同的语言构造。
另外,正如 @D Stanley 在他的回答中指出的那样,截断堆栈跟踪可能是所需的行为。
至于您关于编译器不发出警告的问题,警告不良做法不是编译器的工作,有代码分析工具。例如,托管代码分析工具将针对throw ex; CA2200 发出警告:重新抛出以保留堆栈详细信息
| 归档时间: |
|
| 查看次数: |
232 次 |
| 最近记录: |