投掷和捕捉异常

时间:2012-08-07 20:10:13

标签: java exception exception-handling

Hey StackOverflow社区,

关于抛出异常。一般来说,我什么时候抛出和异常,什么时候抓住它?

让我说我遇到过这种情况,因为发生了一些问题我无法从中恢复。我扔了还是抓住了?

我现在就这样做:

    try {
       // some code
    }
    catch (IOException e) {
       logger.info("Failed to do something, and cannot continue" + e.getMessage(), e);
       e.printStackTrace();
       throw e;
    }

这是正确的做法吗?如果我抛出异常会更合适吗?对不起,我是例外的新手:)

6 个答案:

答案 0 :(得分:8)

当您希望程序继续运行时,通常会在方法中捕获异常。如果需要更高级别的方法来调用该方法来处理异常,则抛出异常。例如,您可以将它一直抛回Main方法,该方法具有try..catch块(可能具有针对不同异常的不同catch块)封装所有方法调用,并且可以在那里处理异常(例如,结束该计划。)

请记住,抛出异常将立即终止该方法。这会影响代码的流程。如果在方法中间可能有异常,并且如果发生异常则下面的代码无法运行,那么您需要将整个部分包装在try / catch块中或抛出异常。

一般的建议 - printStackTrace()很糟糕。您可以自己创建更好的错误输出(并且您可以在输出中包含堆栈跟踪)。更好的是,使用日志记录。

我建议您阅读this introduction to exceptionsthis article which covers good and bad exception patterns

答案 1 :(得分:1)

如果发生致命异常,请捕获异常并很好地结束您的程序。没有捕获的重新抛弃只会扼杀你的程序。

答案 2 :(得分:1)

如果您知道异常不是您可以处理的事情,那么让异常在没有捕获它的情况下进行。有一个异常处理程序捕获所有内容并将其与stacktrace一起记录到文件中。例如,如果您的程序从命令行运行,您可以捕获main方法中的所有内容并将其记录在那里。

答案 3 :(得分:1)


当您与它有关时,捕获异常。在您的情况下 - 写入日志,向用户显示消息并以有序的方式退出。
发生一个异常,当它发生时,你无法做任何事情。

我建议您使用Microsoft的企业库异常处理应用程序块。它将帮助您处理异常,这是一种能够控制流量并以配置方式进行更改的方法。

答案 4 :(得分:0)

捕获后我会记录事件,然后做你需要的东西,以便整齐地关闭,然后调用System.exit,但我不会再次抛出该异常。

答案 5 :(得分:0)

由于未处理的异常导致程序终止是不好的做法。如果您发现致命且不可恢复的异常,请执行以下操作:

  1. 记录
  2. 执行任何必要的清理工作
  3. 终止程序