运行时异常即使被捕获也被抛出?

时间:2013-05-19 11:39:21

标签: java

我有一个在数据库中写入的方法,但是如果它无法在数据库中写入,那么我使用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能够知道发生了异常,因此它可以发送正确的消息。

4 个答案:

答案 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引起的......让它们更难调试。