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 上显示一些通用错误消息作为我的小部件的一部分?

编辑:

我也不希望我的用户在尝试执行某些操作时看到异常堆栈跟踪。

桑达尔

4

4 回答 4

3

我认为捕捉RuntimeExceptions 是不好的做法。最初RuntimeException被认为是编程错误的前兆(例如NullPointerException,指示null缺少检查)。而检查异常意味着表明程序可以从中恢复的错误(例如FileNotFoundException)。

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

这是我个人对企业发展这件事的看法。我知道大多数人都要求删除已检查的异常并将所有内容作为未检查的异常处理(如在 Scala 中)。

于 2013-01-11T07:17:47.377 回答
2

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

例如,在 struts2 中你会这样:

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

我从不使用 spring mvc,但这篇文章似乎为您提供了 über 异常处理程序的选项:

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

于 2013-01-11T07:24:27.367 回答
1

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

  try {
  ...
  } catch ( Exception e ) {
  throw new RuntimeException("msg",e);
  }  
于 2013-01-11T05:31:01.557 回答
0

我认为 RuntimeException 是为违约或一些不可恢复的故障等情况而设计的。大多数时候,您应该让容器或一些外部基础设施为您处理它。或者你必须编写大量冗余代码来处理它们,这有点违背 Spring 的设计理念。

在您的情况下,如果您确实需要将它们传输到其他一些通用消息,您可能可以利用一些过滤器或拦截器来捕获那些意外的 RuntimeException。

于 2013-01-11T11:23:19.043 回答