答案 0 :(得分:96)
throw
关键字本身只会重新引发上面catch
语句捕获的异常。如果你想做一些基本的异常处理(也许是回滚事务的补偿操作)然后重新抛出调用方法的异常,这很方便。
与捕获变量中的异常并抛出该实例相比,此方法有一个明显的优势:它保留了原始调用堆栈。如果你捕获(Exception ex)然后抛出ex,你的调用堆栈将只从那个throw语句开始,你就会丢失原始错误的方法/行。
答案 1 :(得分:12)
有时您可能想要这样做:
try
{
// do some stuff that could cause SomeCustomException to happen, as
// well as other exceptions
}
catch (SomeCustomException)
{
// this is here so we don't double wrap the exception, since
// we know the exception is already SomeCustomException
throw;
}
catch (Exception e)
{
// we got some other exception, but we want all exceptions
// thrown from this method to be SomeCustomException, so we wrap
// it
throw new SomeCustomException("An error occurred saving the widget", e);
}
答案 2 :(得分:3)
它重新抛出完全相同的错误,你没有得到任何东西。
有时您可以使用catch方法进行一些日志记录或其他事情,而不会像这样填写您的异常:
catch (Exception) {
myLogger.Log(LogLevels.Exception, "oh noes!")
throw;
}
我最初误以为这会放松你的筹码,但这只会是你要做的事情:
catch (Exception err) {
throw err;
}
答案 3 :(得分:3)
我能想到的唯一理由是你是否想在调试过程中设置一个断点 它也是我认为的一些工具生成的默认代码。
答案 4 :(得分:2)
只需重新抛出当前异常,该异常将保持其“源”和堆栈跟踪。