Spring @ExceptionHandler处理多种异常

时间:2010-11-19 00:25:28

标签: spring exception-handling

我无法弄清楚如何通过@ExceptionHandler处理多种异常。

我需要以编程方式处理这些异常,为此我需要一个共享引用。这是通过这个参考“Exception ex”完成的吗?我不这么认为,因为异常没有像这样被抓住,我怎么办呢?

我不能将所有异常引用作为参数添加到处理程序方法中,它没有意义,它不能以编程方式处理。我需要一个共享引用,以便我可以在其上使用“instanceof”或者只是将其作为一般“异常”发送到其他地方

@ExceptionHandler({DescriptionCstOrderException.class, SpecializationCstOrderException.class, NoUploadFileException.class,
                    DeadLineCstOrderException.class, DocumentCstOrderException.class, CommentCstOrderException.class})
public String handleFormException(Exception ex, ActionRequest actionRequest) {
    logger.error(ex.getMessage());
    SessionErrors.add(actionRequest, ex.getClass().getName());  
    return "mainOrderForm";
  }

其他问题:如果我想处理org.springframework.web.multipart.MaxUploadSizeExceededException,该处理程序的任何方法都没有抛出该怎么办?因为@ExceptionHandler只捕获从其中一个处理程序方法抛出的异常。

可以将exceptionHandler方法放入某个扩展父控制器,但如果只使用defaultAnnotationHandlerMapping ...?

感谢任何帮助,我会发疯,这非常令人沮丧......

4 个答案:

答案 0 :(得分:30)

@ExceptionHandler值可以设置为Exception类型数组。

使用Spring documentation中提到的异常数组的实现将类似于

@ExceptionHandler({ NotFoundException.class, MissingServletRequestParameterException.class })

答案 1 :(得分:19)

@ExceptionHandler值可以设置为Exception类型的数组。如果抛出的异常与列表中的某个类型匹配,则将调用使用匹配的@ExceptionHandler注释的方法。如果未设置注释值,则使用列为方法参数的异常类型。有关详细信息,请参阅documentation

答案 2 :(得分:0)

您的问题相当混乱,但您的异常处理程序方法一次只能处理一个异常。它不会捕获多个异常,然后将它们都传递给handleFormException()方法。如果需要以不同方式处理这些异常类型,则应为每个异常处理程序方法创建一个异常处理程序方法,为方法指定该特定异常类型的参数,然后执行相应的处理。例如:

@ExceptionHandler(DescriptionCstOrderException.class)
public String handleDescriptionCstOrderException(DescriptionCstOrderException exception, ActionRequest actionRequest) {...}


@ExceptionHandler(SpecializationCstOrderException.class)
public String handleSpecializationCstOrderException(SpecializationCstOrderException exception, ActionRequest actionRequest) {...}

// and so on...

有关详细信息,请参阅Spring文档:

http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/mvc.html#mvc-ann-exceptionhandler

答案 3 :(得分:0)

我自己也遇到过这个问题。当我试图整合Bugsnag的方法时,实际上出现了这个问题。 Bugsnag将它的线程附加到Thread.UncaughtExceptionHandler,如果Thread.UncaughtExceptionHandler已经被另一个机制处理(在我的情况下:带有InvocationTargetException的AopUtils),那么Bugsnag将无法将其推入到它中#39 ;门户网站的信息中心。 Bugsnag应该在没有处理未处理异常的伤害的情况下工作,如果它只是直截了当而且不会在Spring fw的其他地方处理。

现在我想写一个统一的ExceptionHandler,我遇到了Spring的@ControllerAdvice。对于一个场景,我知道来自应用程序任何部分的NullPointerException调用AopUtil的InvocationTargetException。所以我编写了一个处理InvocationTargetException的@ExceptionHandler,但是其他任何类型的RunTime异常呢。这可能会成为制作的噩梦。

我只想要一个通用机制来处理从应用程序的任何部分抛出的任何类型的异常,简单地收敛到这个方法。而且我相信这正是@lisak所要求的。思绪,有人吗?