2012-09-13 52 views
2

我在处理web应用程序中的异常时有问题。我经常听到捕捉超类异常是一个坏主意。Java异常处理 - 捕获超类异常

我经常编写代码来捕获struts action/java servlet类中的所有异常。

try { 
    // call business facade 
    // business facade calls DAO 
    // any exception from DAO bubbles up 
} catch (Exception e) { 
    log.error("error", e); 
} 

如果我们不捕获超类异常。我们如何处理任何意外的运行时错误并对其进行适当的记录

回答

6

您可以setup a DefaultUncaughtExceptionHandler为您的项目处理未捕获的异常。举例来说,这是一段代码,我在我的项目之一:

private static void setDefaultUncaughtExceptionHandler() { 
    try { 
     Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() { 

      @Override 
      public void uncaughtException(Thread t, Throwable e) { 
       logger.error("Uncaught Exception detected in thread {}", t, e); 
      } 
     }); 
    } catch (SecurityException e) { 
     logger.error("Could not set the Default Uncaught Exception Handler", e); 
    } 
} 
+0

如何使用旧版Java编写的项目? – youcanlearnanything

+0

@optimus从1.5开始可用。对于旧版本,你必须找到另一种方式(1.4已经超过4年的EOL现在...)。 – assylias

+0

@assylias:与此处理程序相关的配置在哪里去?任何示例写作? – kosa

1

添加多个catch块并将Exception catch作为最后一个。

try { 
    // call business facade 
    // business facade calls DAO 
    // any exception from DAO bubbles up 
} catch(SuperClassException se) 
{ 
//Do what you want to do when this exception happens. 
}catch (Exception e) { 
    log.error("error", e); 
} 
2

在Web应用程序,并在代码片断你贴,你是如何处理的根Exception?它看起来像你抓住它,记录下来,然后继续前进。

在web应用程序中99%的情况下,最好允许Exception跳出到web.xml中配置的<error-page>

对于我来说,如果在“调用业务外观”时发现未知错误,那么最好让您的应用程序继续使用其余的逻辑进行卡车运行似乎不太可能。

+0

如果冒泡到配置的它只隐藏用户的堆栈跟踪。对我们而言,我们有兴趣通知用户事务未完成并记录异常 – youcanlearnanything

0

使用Struts,您可以配置一个exception handler来捕获和处理从Action引发的任何异常。至少从Struts 1.2开始,这个功能就已经存在了。你的Action类不应该需要任何try-catch块,除非你需要做某些事情来处理特定的异常。

0

try中的代码主要指定并标记关于可以捕获的已检查的异常。另外,看看里面的代码尝试你可以直观的情况下失败的情况下,相应的未经检查的/运行时异常catch块可以被添加。