2013-01-11 64 views
2

我正在写一个使用Spring 3框架的web应用程序。考虑一下我拥有N个控制器的情况。每个控制器将请求委托给公开的服务并获得响应并返回给用户。捕获意外异常是否是一种好的做法?

我想知道是否有更好的方法来捕获意外的运行时异常抛出控制器代码。我不想为每个控制器方法编写如下所示的内容。或者它是唯一的方法?

try { 
    //call the service 
} catch(ServiceException serviceEx) { 
    //do process for know exception 
} catch(Exception ex) { 
    //return generic error message. 
} 

我知道我们可以使用Spring Exception resolver。但是当意外错误发生时,我不想显示不同的错误页面。我想在UI上显示一些通用的错误消息,作为我的小部件的一部分?

编辑:

我也不想我的用户看到异常堆栈跟踪试图执行某些操作时。

孙大信

+0

是否有预期的异常? –

+0

@阿米尔:一个“预期”的例外是你特别捕捉的例外。你期待它,这就是为什么你写了一个'catch'子句。意想不到的是你不会捕获的,这可能会以堆栈跟踪的形式出现在UI中。 – Gabe

回答

1

您可以捕捉使用此方法运行时意外的异常。

try { 
    ... 
    } catch (Exception e) { 
    throw new RuntimeException("msg",e); 
    } 
3

我想赶上RuntimeException s是不好的做法。原本为RuntimeException s,认为是编程错误的人员(例如NullPointerException,表示缺少null检查)。而检查的异常意味着指出程序可以从中恢复的错误(例如FileNotFoundException)。

今天的问题是,许多框架使用RuntimeException s应该使用检查的异常。因此很难区分程序可以处理异常的情况和遇到编程错误(bug)的情况。

这是我个人对企业发展这个东西的看法。我知道大多数人要求放弃检查的异常,并将所有事情都作为未经检查的异常处理(如Scala)。

2

在我看来,你应该只在你的代码中捕捉异常,你可以从中恢复。所有其他异常(选中或未选中)都应该被一个异常处理程序捕获,该异常处理程序将记录异常并向用户显示一些通用错误页面(可能带有可用于查找异常的id)。

例如,在Struts2你会说这像这样:

<global-exception-mappings> 
    <exception-mapping exception="java.lang.Exception" result="unrecoverableException"/> 
</global-exception-mappings> 

我从来没有使用Spring MVC的,但这篇文章似乎给您一个尤伯杯的ExceptionHandler的选项:

http://doanduyhai.wordpress.com/2012/05/06/spring-mvc-part-v-exception-handling/

0

我认为RuntimeException是为违反合同或某些不可恢复的错误而设计的。大多数情况下,您应该让容器或一些外部基础架构为您处理。或者你必须编写大量冗余代码来处理它们,这与Spring的设计哲学有点相冲突。

就你而言,可能是你可以利用一些过滤器或拦截器来捕获那些意外的RuntimeException,如果你真的需要将它们转移到一些其他通用消息。

相关问题