2

我有一个方法抛出异常

public int myMethod throws Exception

我有另一个函数调用 myMethod 函数和 hava try-catch 块。我抛出运行时异常以强制终止程序。这是终止程序的正确方法吗?如果我这样做,它会打印两次堆栈跟踪,并且来自 RuntimeException 的堆栈跟踪是无用的。

在 catch 子句中终止程序并打印完整堆栈跟踪的建议方法是什么。

public int callMyMethod(){
     try{
         myMethod();
     }
     catch(Exception ex){
          ex.printStackTrace(System.out);
          throw new RuntimeException();
     }
}
4

3 回答 3

9

答案是“视情况而定”。

如果此代码是应用程序本身的一部分,那么调用System.exit(int)可能是最好的选择。(但如果应用程序“失败”,那么您应该exit使用非零返回码进行调用。零通常意味着“成功”。)

但是,如果此代码很可能会在更大的 Java 应用程序中嵌入/重用,那么调用System.exit(...)就会出现问题。例如,System.exit(...)当发生不好的事情时调用的库将对使用它的应用程序造成严重破坏。

对于类似的事情,您可能会抛出一个自定义运行时异常,您可以在您的main方法中专门捕获和处理该异常。(如果我这样做,我会将Exception作为构造函数参数传递给自定义异常......并使其成为cause异常。那时我不会打印它/记录它。)

System.exit(...)当你进行单元测试时,调用也会导致问题......'因为调用很可能会在运行测试套件的 JVM 上拔掉插头!)


另一点是这catch (Exception ...)几乎总是一个坏主意。关键是这几乎可以捕捉到所有事情(包括你做梦都想不到的各种事情!)并将它们埋葬。捕获您期望的特定异常(例如检查的异常)并可以处理...并让其余的以正常方式传播会好得多。

catch (Exception ...)如果您因为使用了声明为 throwing 的东西而被卡住,那么Exception处理它的最佳方法是更改throws Exception​​ . 而且越早越好。更改throws Exception以声明您希望该方法抛出的(更多)特定异常的列表。

于 2013-05-11T00:56:37.613 回答
1
public int callMyMethod(){
     try{
         myMethod();
     }
     catch(Exception ex){
          ex.printStackTrace(System.out);
          System.exit(0); // terminates with exit code 0, no extra stack trace.
     }
}
于 2013-05-11T00:46:06.103 回答
0

异常处理是编程中最重要的方面之一。您的问题的答案取决于您正在处理的应用程序类型。

system.exit(0) 只会终止您的程序,这会造成很多破坏。还要确保您永远不会捕获 Exception ,如果您这样做,那么您将捕获所有您可能不打算处理的异常类型。

始终捕获特定异常,以便您有机会以您需要的方式处理它。

于 2013-05-11T04:10:02.083 回答