投掷和捕捉异常

问题描述:

嘿*社区,投掷和捕捉异常

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

假设我遇到这种情况,因为发生了一些问题而不得不退出,我无法从中恢复。我会抛出还是被抓到?

我现在这样做的权利:

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

这是应该做的事情吗?如果我抛出异常,会更合适吗?对不起,我是一个新手,例外情况下:)

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

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

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

我推荐阅读this introduction to exceptionsthis article which covers good and bad exception patterns

如果发生致命异常,赶上异常并很好地结束你的程序。重蹈覆辙而没有捕捉将会杀死你的程序。

捕获后我会记录事件,然后做你需要什么才能整齐关闭然后调用System.exit但我不会再抛出异常。

由于未处理的异常导致程序终止是一种不好的做法。如果你发现一个异常是致命的和不可执行以下操作:

  1. 记录它
  2. 执行任何necissary清理
  3. 终止程序

如果你知道的例外是不是你可以处理,让异常去首先没有捕捉它。有一个捕获所有内容的异常处理程序,并将其与堆栈跟踪一起记录到文件中。例如,如果你的程序正在从命令行运行,你可以捕获主要方法中的所有内容并将其记录在那里。

+0

所以你说如果我有一个我无法在该方法中处理的异常,我应该抛出它。但是,如果我可以用同样的方法从它中恢复过来,那么就可以在方法内部找到合适的位置。 另外,我是否应该为实现抛出它的底层方法的(方法,测试)留下异常捕获? – 2012-08-07 20:25:47

+0

是的,你只能抓住你能做些什么。我不明白最后一部分,你可以重述吗? – 2012-08-07 20:29:38

+0

对不起,让我再试一次。我真正想要说的是,当我使用某种方法在某个单元测试或主方法中引发异常时,我们假设我让测试抛出异常。那里会发生什么?它刚刚退出吗?它是否打印错误消息? 这种情况下最适合做什么? – 2012-08-07 20:38:12


赶上当你与它有关系时有个例外。在你的情况下 - 写入日志,向用户显示一条消息,并以有序的方式退出。
You throw当发生这种情况时,您无法做任何其他事情。

我建议您使用微软的企业库异常处理应用程序块。它将帮助你处理你的例外情况,这样你就可以控制流程并进行配置更改。