可以处理运行时异常吗?

Vin*_*C M 2 java exception-handling

不处理运行时异常通常是一种很好的做法.

我有这种情况:

  /**boolean returns false if the method execution fails,
  so that an error can be shown to user*/ 
boolean saveData()
 {
    try
    {
         //Some database calls that throw only Runtime exceptions
     }
     catch(Exception e)
     {
         //Log the exception and return false
         return false;
     }
     return true;

 }
Run Code Online (Sandbox Code Playgroud)

所以从Servlet调用它将得到一个布尔值.如果它是假的,我们会显示一条消息"Save not sucessful".这样可以,还是有更好的方法吗?

And*_*son 5

可以处理运行时异常吗?

只要你能在那时做一些聪明的事,是的.这种"永远不会捕获运行时异常"纯粹是无稽之谈.你可能也想记录它们并做其他事情.


Mar*_*nik 5

不处理运行时异常通常是一种很好的做法.

这句话暗示了一个错误的前提:问题不在于是否,而是何时捕获运行时异常.

在你的代码中的某些时候,你肯定应该有一个"catch-all"异常处理程序.这一点称为异常障碍,它在调用堆栈中足够高以包含完整的工作单元(基本上,一个数据库事务的范围).

这应该是你的管理原则:

  • 如果异常必须导致当前工作单元被中止(回滚),那么在异常障碍之前不要捕获该异常 ;

  • 如果异常只是本地字符,并且它的外观仅意味着采用不同的路由来处理请求,那么尽早捕获并处理它.

请注意,上述内容不使用无效的检查/未检查区别.大多数现代框架完全避免了检查异常,并且不遗余力地保护程序员免受从低级代码抛出的异常.

在实践中,超过90%的例外是第一种,中止的.这就是术语"不可恢复"的含义 - 这意味着您无法继续正在进行的操作,但服务器可以保持运行并处理所有其他请求.我看到许多人将此与"JVM即将死亡"混淆,但具有这种意义的例外非常罕见,通常没有特殊的处理代码.

最后,需要注意的是,"全面"的处理程序应该抓住不仅RuntimeExceptions而且Error因为你想每一个例外记录的方式相同.如果让异常转义应用程序代码,则不知道它将导致什么行为.请注意,存在一些常见错误,例如StackOverflow和OutOfMemory,它们原则上可能导致不可恢复的损坏,因此属于Error层次结构,但在大多数现实情况下,除了中止当前请求之外不会造成任何损害.你肯定不想在第一眼看到这样的错误时关闭你的服务.