7

嘿 StackOverflow 社区,

关于抛出异常。一般来说,我什么时候抛出异常,什么时候捕获它?

假设我遇到了这种情况,由于发生了一些问题而我不得不退出并且我无法从中恢复。我扔还是接住?

我现在这样做:

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

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

4

6 回答 6

10

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

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

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

我推荐阅读这篇关于异常的介绍这篇介绍好的和坏的异常模式的文章。

于 2012-08-07T20:25:05.773 回答
1

如果发生致命异常,则捕获异常并很好地结束您的程序。重新抛出而不捕获只会杀死你的程序。

于 2012-08-07T20:13:37.837 回答
1

如果您知道异常不是您可以处理的,请让异常离开而不首先捕获它。有一个异常处理程序可以捕获所有内容并将其与堆栈跟踪一起记录到文件中。例如,如果您的程序从命令行运行,您可以在 main 方法中捕获所有内容并将其记录到那里。

于 2012-08-07T20:20:46.157 回答
1


当您与它有关时,您会 捕获异常。在您的情况下 - 写入日志,向用户显示消息并有序退出。
当它发生时,您无能为力时抛出异常。

我推荐你使用微软的企业库异常处理应用程序块。它将帮助您处理异常,这是一种您能够控制流程并进行配置更改的方式。

于 2012-08-07T20:23:29.750 回答
0

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

于 2012-08-07T20:14:54.607 回答
0

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

  1. 记录它
  2. 执行任何必要的清理工作
  3. 终止程序
于 2012-08-07T20:17:09.100 回答