8

想问你一个关于 spring-mvc 控制器的最佳实践问题。请查看以下代码:

    @Autowired
    SomeService service;

    @RequestMapping (...)
    public @ResponseBody Response createSomething () {

       try {

            serviceResponse = service.doSomething();

            //create a success response and return

       }
       catch (SomeServiceException e) {
             //create an error response and return 
       }

}

在控制器级别进行错误处理是正常的做法吗?或者服务类不应该像上面显示的那样抛出异常。请查看并告诉我。

4

5 回答 5

7

我会说您有三种策略,具体取决于您的用例。

大致有三种策略:HandlerExceptionResolver、@ExceptionHandler和在 action 内部处理异常。

这些用例是:整个应用程序的通用异常处理程序、整个控制器、相应的特定操作。

于 2012-11-21T14:51:40.493 回答
2

我想说最好的做法是使用@ExceptionHandler。在控制器方法中处理异常的缺点是它使代码的可读性降低,并且可能在许多控制器方法中重复。

我建议为您的控制器创建一个基类,并定义 @ExceptionHandler。这样它就可以用于许多不同的控制器,而无需任何代码重复。这将比异常解析器方法更具可读性,但可以结合使用。

于 2012-11-21T07:26:33.243 回答
1

服务类可以/应该抛出异常..您可以在控制器中处理这些异常以进行日志记录..您也可以根据控制器上捕获的异常显示适当的错误页面..但这会很乏味..最好尝试使用 spring 异常处理..http://www.mkyong.com/spring-mvc/spring-mvc-exception-handling-example/

于 2012-11-21T06:42:46.553 回答
0

在 Handler 类的 bean 定义文件中定义 bean。当程序中抛出任何异常时,会调用resolveException方法。

  public class Handler
        implements HandlerExceptionResolver
    {

        public Handler()
        {
        }

        public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
        {
            if(ex instanceof ErrorType1Exception))
            {
                 ModelAndView test = new ModelAndView("errorpage1jsppage");
return test;
            } else
            if(ex instanceof ErrorType2Exception))
            {
                 ModelAndView test1 = new ModelAndView("errorpage2jsppage");
return test1
            }
        }
    }
于 2013-04-05T08:33:00.110 回答
0

异常处理的一个好习惯是早抛出晚捕获。在您的情况下,这意味着在控制器而不是服务上捕获错误。这里的优点是您可以根据客户端请求(SOAP/REST/JSON...)编写不同的控制器,以不同方式处理异常。但是,如果该逻辑存在于服务中,那么在响应不同客户端时,您在如何处理来自服务的返回方面的灵活性就会降低。

于 2019-05-30T18:49:26.943 回答