Java 即使捕获到运行时异常,也会抛出它们吗?

Java 即使捕获到运行时异常,也会抛出它们吗?,java,Java,我有一个在数据库中写入的方法,但如果它不能在数据库中写入,那么我使用异常类将其捕获为运行时异常 public fun() { try { writeInDb(....); } catch(Exception E) { //log the event } } 现在我有另一个函数调用这个函数fun(),但它也捕获异常,并根据结果向客户端发送消息,判断是否成功。e、 g: funA() { try { fun();

我有一个在数据库中写入的方法,但如果它不能在数据库中写入,那么我使用
异常类将其捕获为
运行时
异常

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
是否能够知道发生了异常,以便它可以发送正确的消息。

如果在fun()中捕获异常,funA()将无法识别它。如果fun()抛出它,它将能够捕获它。如果捕获并处理它,则不会重新抛出任何异常(运行时或已检查)


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

altsyset完全正确

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


这不仅是风格的问题,也是性能的问题——异常处理会减慢程序的速度,所以你不应该轻易地将它们抛诸脑后(双关语)。对此进行了一些讨论,但共识似乎是过度使用异常是不可取的。

答案是
funA
不会看到由
writeDB
引发的异常,因为
fun
捕获了它

您可以在
fun
中重新播放它,如下所示:

  catch (Exception e) {
       //log the event
       throw e;
  }
然而,有一个问题。如果您这样做,编译器现在会抱怨
fun
需要声明为抛出
异常
。(这种“感染”很可能会传播……)

正确的解决方案是不捕获
异常
。相反,您应该捕获
运行时异常
;e、 g

  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
以抛出特定的已检查异常


捕捉Throwable/Exception/RuntimeException的问题在于,您常常会捕捉到代码无法有效处理的各种意外异常。最好抓住你期待的,让其他的通过。如果你捕捉到了所有的东西,很有可能你最终会埋葬那些实际上是由虫子引起的东西。。。使调试更加困难。

funA()
只有在捕获异常后让
fun()
重新播放时才会看到异常。这是您可以用几行代码轻松尝试的……它不是
异常类
,而是
异常变量
Exception
下面是要捕获的子类
Throwable
。如果您只想捕获运行时异常,请使用
catch(RuntimeException e)
@SimonAndréForsberg我认为SIGSTP的运行时异常意味着运行时错误,与编译错误相反。我理解为这里要捕获的唯一异常是:。但好吧,我可能错了。但是
E
仍然是一个变量,而不是一个类,根据编码标准,应该用小写字母书写。@SimonAndréForsberg-从技术上讲,这是“编码约定”,除非你在一个声明为“标准”的组织内工作。