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".这样可以,还是有更好的方法吗?
不处理运行时异常通常是一种很好的做法.
这句话暗示了一个错误的前提:问题不在于是否,而是何时捕获运行时异常.
在你的代码中的某些时候,你肯定应该有一个"catch-all"异常处理程序.这一点称为异常障碍,它在调用堆栈中足够高以包含完整的工作单元(基本上,一个数据库事务的范围).
这应该是你的管理原则:
如果异常必须导致当前工作单元被中止(回滚),那么在异常障碍之前不要捕获该异常 ;
如果异常只是本地字符,并且它的外观仅意味着采用不同的路由来处理请求,那么请尽早捕获并处理它.
请注意,上述内容不使用无效的检查/未检查区别.大多数现代框架完全避免了检查异常,并且不遗余力地保护程序员免受从低级代码抛出的异常.
在实践中,超过90%的例外是第一种,中止的.这就是术语"不可恢复"的含义 - 这意味着您无法继续正在进行的操作,但服务器可以保持运行并处理所有其他请求.我看到许多人将此与"JVM即将死亡"混淆,但具有这种意义的例外非常罕见,通常没有特殊的处理代码.
最后,需要注意的是,"全面"的处理程序应该抓住不仅RuntimeExceptions而且Error因为你想每一个例外记录的方式相同.如果让异常转义应用程序代码,则不知道它将导致什么行为.请注意,存在一些常见错误,例如StackOverflow和OutOfMemory,它们原则上可能导致不可恢复的损坏,因此属于Error层次结构,但在大多数现实情况下,除了中止当前请求之外不会造成任何损害.你肯定不想在第一眼看到这样的错误时关闭你的服务.