我正在做Spring MVC,但我不知道如何使用未处理的异常。我想在代码中抛出异常时向用户显示一些自定义错误文本。我不想在web.xml中设置404页面,因为所有异常都会转到一个页面,而这对用户来说没有任何信息。
这可能是一个愚蠢的例子,但我在@Service
- 类中有其他代码,这些代码会抛出异常。
@Controller
public class Control {
@RequestMapping(value = "something", method = RequestMethod.POST)
public String Form(HttpServletRequest request) {
String name = request.getParameter("name");
Validate v = Validate();
v.giveAName(name);
}
@Service
public class Validate {
public void giveAName(String name){
if (name==null) {
throw new MyException("Name is null");
} catch (MyException e) {
e.getMessage();
//How do I here pass that getMessage value ("Name is null") back to Control-class
//(and from there to JSP)?
}
}
public class MyException extends Exception {
public MyException(String message) {
super(message);
}
}
答案 0 :(得分:1)
我可能会从MyException
而不是RuntimeException
扩展Exception
,然后将您的try / catch块放在控制器中。然后你可以在那里抓住MyException
。也就是说,通常异常中的错误消息不是向用户显示的最佳信息,因此您可能希望使用spring自定义错误消息执行某些操作。
答案 1 :(得分:1)
Spring MVC有两种干净利落的方式来处理来自服务层的异常。
@ExceptionHandler
注释方法。将为其声明的任何Exception
调用此方法,可以像任何其他控制器方法一样访问请求,响应或会话,并且可以返回视图名称或ModelAndView
HandlerExceptionResolver
。您应该注意到,默认情况下,DispatcherServlet
会注册DefaultHandlerExceptionResolver
来处理某些标准的Spring MVC异常。编辑:使用@ExceptionHandler
的示例:
在服务层中,您只需抛出异常:
@Service
// as MyException is not a RunTimeException it must be declared
public class Validate throws MyException {
public void giveAName(String name){
if (name==null) {
throw new MyException("Name is null"); // not caught locally ...
}
}
在你的控制器中,你设置一个异常处理程序来捕获异常:
@ExceptionHandler(MyException.class)
public ModelAndView handler(MyException me){
ModelAndView model = new ModelAndView("index");
model.addObject("error", me.getMessage());
return model;
}
}