0

我有一个写入数据库的方法,但如果它无法写入数据库,那么我Runtime使用Exception Class.

public fun()
{
  try
  {
        writeInDb(....);
  }
  catch(Exception E)
  {
       //log the event
  }
}

现在我有另一个函数调用此函数fun(),但它也捕获异常并根据结果向客户端发送消息,无论成功与否。例如:

funA()
{
   try
   {
      fun();
   }
   catch(Exception E)
   {
       //send message to user
   }
}

我在这里有一个疑问,因为fun()我已经捕获了运行时异常,所以将funA能够知道发生了异常,以便它可以发送正确的消息。

4

4 回答 4

2

如果你在 fun() 中发现异常,funA() 将无法识别它。如果 fun() 抛出它,它将能够捕获它

于 2013-05-19T11:43:10.103 回答
2

如果您捕获并处理它,则不会重新抛出异常(运行时或检查)。

一旦在方法中捕获到异常,您就必须决定该方法是应该处理异常还是重新抛出异常,以便调用者可以处理它。

于 2013-05-19T11:53:37.150 回答
2

altsyset 是完全正确的。

我只是想补充一点,不应将异常用作数据传输的手段。如果您处理 中的异常fun(),请做出相应的反应!使用fun()的返回值来通知funA()错误——或者如果你绝对必须有一个新的、有意义的异常。

这不仅是风格问题,而且是性能问题——异常处理会减慢你的程序,所以你不应该轻易扔掉它们(双关语)。这个问题提供了一些讨论,但共识似乎是过度使用异常是不可取的。

于 2013-05-19T11:53:52.580 回答
1

答案是funA不会看到writeDB因为fun已经捕获它而引发的异常。

可以把它重新扔进去fun,像这样:

  catch (Exception e) {
       //log the event
       throw e;
  }

但是,有一个问题。如果你这样做,编译器现在会抱怨fun需要声明为 throwing Exception。(而且这种“感染”很可能会传播……)

正确的解决方案是 NOT to catch Exception。相反,您应该抓住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.
  }

或者更好的是,捕获RuntimeException您当时期望的显式子类......或者甚至更好(IMO),更改writeInDb为抛出特定的 CHECKED 异常。

捕获 Throwable/Exception/RuntimeException 的问题在于,您通常最终会捕获代码无法有效处理的各种意外异常。最好抓住你期待的那些,让其余的通过。如果你抓住了所有的东西,那么你很有可能最终会掩埋那些实际上是由错误引起的……这使得调试它们变得更加困难。

于 2013-05-19T11:57:48.393 回答