...
catch(Exception e)
{
throw new Exception("msg", e);
}
我是抛出异常还是重新抛出异常?
所以说,在 catch 语句中使用 throw 子句是 重新抛出 异常,而在 try 块或其他地方使用它则是 抛出 异常,这种说法是正确的吗?
最终,在何时何地使用 throw 抛出异常,何时何地使用 re-throw 重新抛出异常?
谢谢。
...
catch(Exception e)
{
throw e;
}
如果我想把几个异常包装成一个,或者想添加新信息,我会抛出一个新的异常。否则,我认为最好重新抛出它。
第一次时抛出异常。
throw new Exception();
你重新抛出了一个捕获的异常。
} catch (Exception e) {
// do something
throw e;
}
你可以通过抛出另一个异常,并将原始异常包含在其中来包装异常。
} catch (Exception e) {
// do something
throw new Exception(e);
}
http://www.codinghorror.com/blog/2004/07/rethrowing-exceptions.html
这个链接应该会帮助您决定何时重新抛出异常。
通常情况下,catch 应该能够处理异常本身,但如果不能,则建议重新抛出异常。还要注意 catch 的位置(例如在控制器还是模型中,通常要将 catch 放在控制器操作中,以便在视图中处理它。但是,模型中经常发生异常)
回答最后一个问题:
如果这样做会增加价值,请抛出新的异常。例如,通常会将底层异常封装在应用程序特定的异常中,以便在更高层次上使用。这些异常几乎总是要链接起来以保留原始异常的信息。
我认为重新抛出通常不是一个好主意,因为异常链/堆栈跟踪中会删除一层上下文。另一方面,如果您确实无法处理它,重新抛出可能是最合适的选择。在这种情况下,我通常指示该方法throws
并且除非需要清理本地资源等,否则不进行本地异常处理。
你的问题是:“我是在抛出异常还是重新抛出异常?”
你既不是在抛出异常,也不是在重新抛出异常。 你正在抛出一个带有新消息的新异常。 原始的 e 异常(被捕获的异常)是你抛出新异常的原因,因此它将出现在新抛出异常的 causedBy 中。
哦,天啊。
throw e
。 - Beau Grantham