我有一个在数据库中写入的方法,但是如果它无法在数据库中写入,那么我使用Runtime
将其作为Exception Class
异常捕获。
public fun()
{
try
{
writeInDb(....);
}
catch(Exception E)
{
//log the event
}
}
现在我有另一个函数调用此函数fun()
但它也捕获异常,并根据结果向客户端发送消息是否成功。 e.g:
funA()
{
try
{
fun();
}
catch(Exception E)
{
//send message to user
}
}
我在这里有一个疑问,因为在fun()
中我已经捕获了运行时异常,因此funA
能够知道发生了异常,因此它可以发送正确的消息。
答案 0 :(得分:2)
如果你在fun()中发现了异常,那么funA()将无法识别它。如果fun()抛出它就能捕获它
答案 1 :(得分:2)
如果捕获并处理,则会重新抛出异常(运行时或已检查)。
一旦在方法中捕获到异常,您就必须决定此方法是应该处理异常还是重新抛出异常,以便调用者可以处理它。
答案 2 :(得分:2)
altsyset是完全正确的。
我只想补充一点,不应将异常用作数据传输方式。如果您在fun()
中处理异常,则做出相应的反应!使用fun()
的返回值来通知funA()
错误 - 或者如果你必须有一个新的,有意义的异常。
这不仅仅是一种风格问题,而是一种性能问题 - 异常处理会降低你的程序速度,所以你不应该轻易抛弃它们(双关语)。 This question提供了一些讨论,但共识似乎是过度使用例外是不可取的。
答案 3 :(得分:1)
答案是funA
不会看到writeDB
引发的异常,因为fun
已经抓住了它。
你可以<{1}} 重新抛出它,就像这样:
fun
但是,有一个问题。如果这样做,编译器现在会抱怨 catch (Exception e) {
//log the event
throw e;
}
需要声明为抛出fun
。 (这种“感染”可能会传播......)
正确的解决方案是不要抓住Exception
。相反,你应该抓住Exception
; e.g。
RuntimeException
或者更好的是,抓住你期望的 catch (RuntimeException e) {
//log the event
throw e; // Now the compiler knows that the exception is unchecked
// and therefore we don't need to declare it in the method
// signature.
}
的显式子类......或者更好的是(IMO),更改RuntimeException
以抛出特定的CHECKED异常。
捕获Throwable / Exception / RuntimeException的问题在于,您经常会遇到代码无法有效处理的各种意外异常。最好抓住你期待的那些,让其余的通过。如果你抓住了所有东西,你很可能会最终掩盖那些实际上是由bug引起的......让它们更难调试。