【问题标题】:What is the good practice to terminate program in catch clause在 catch 子句中终止程序的好习惯是什么
【发布时间】:2013-05-11 00:44:35
【问题描述】:

我有一个方法抛出异常

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();
     }
}

【问题讨论】:

    标签: java exception try-catch


    【解决方案1】:

    答案是“视情况而定”。

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

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

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

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


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

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

    【讨论】:

      【解决方案2】:
      public int callMyMethod(){
           try{
               myMethod();
           }
           catch(Exception ex){
                ex.printStackTrace(System.out);
                System.exit(0); // terminates with exit code 0, no extra stack trace.
           }
      }
      

      【讨论】:

        【解决方案3】:

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

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-12-25
          • 1970-01-01
          • 1970-01-01
          • 2015-03-28
          • 1970-01-01
          • 2015-06-11
          相关资源
          最近更新 更多