抛出异常还是重新抛出异常?

3
如果我在catch语句中加入以下内容:
...
catch(Exception e)
{
    throw new Exception("msg", e); 
}

我是抛出异常还是重新抛出异常?

所以说,在 catch 语句中使用 throw 子句是 重新抛出 异常,而在 try 块或其他地方使用它则是 抛出 异常,这种说法是正确的吗?

最终,在何时何地使用 throw 抛出异常,何时何地使用 re-throw 重新抛出异常?

谢谢。


1
你在这里抛出了一个新的异常,它包装了实际的异常。我会将重新抛出分类为 throw e - Beau Grantham
你应该捕获比 Exception 更具体的异常。 - Dan W
6个回答

4
我会称之为抛出异常。
这是重新抛出异常:
...
catch(Exception e)
{
    throw e;
}

如果我想把几个异常包装成一个,或者想添加新信息,我会抛出一个新的异常。否则,我认为最好重新抛出它。


4

第一次时抛出异常。

throw new Exception();

你重新抛出了一个捕获的异常。

} catch (Exception e) {
   // do something
   throw e;
}

你可以通过抛出另一个异常,并将原始异常包含在其中来包装异常。

} catch (Exception e) {
   // do something
   throw new Exception(e);
}

0

http://www.codinghorror.com/blog/2004/07/rethrowing-exceptions.html

这个链接应该会帮助您决定何时重新抛出异常。

通常情况下,catch 应该能够处理异常本身,但如果不能,则建议重新抛出异常。还要注意 catch 的位置(例如在控制器还是模型中,通常要将 catch 放在控制器操作中,以便在视图中处理它。但是,模型中经常发生异常)


0

回答最后一个问题:

如果这样做会增加价值,请抛出新的异常。例如,通常会将底层异常封装在应用程序特定的异常中,以便在更高层次上使用。这些异常几乎总是要链接起来以保留原始异常的信息。

我认为重新抛出通常不是一个好主意,因为异常链/堆栈跟踪中会删除一层上下文。另一方面,如果您确实无法处理它,重新抛出可能是最合适的选择。在这种情况下,我通常指示该方法throws并且除非需要清理本地资源等,否则不进行本地异常处理。


0
如果不满足执行业务条件的特定前提条件,我们将抛出自定义异常,例如,如果账户余额为0,则无法借记,您将抛出NotSufficientAmountException。
重新抛出是为了不同的目的,一是让调用者知道发生了错误,二是将堆栈跟踪传递给调用者,以便在哪行代码出错等方面提供更多详细信息。

0

你的问题是:“我是在抛出异常还是重新抛出异常?”

你既不是在抛出异常,也不是在重新抛出异常。 你正在抛出一个带有新消息的新异常。 原始的 e 异常(被捕获的异常)是你抛出新异常的原因,因此它将出现在新抛出异常的 causedBy 中。

哦,天啊。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接