例外処理
システムには、予期される例外とランタイム例外の2種類の例外があります。前者は例外をキャプチャして例外情報をキャプチャし、後者は主にコードの開発とテストを標準化することでランタイム例外の発生を減らします。システムのdao、サービス、およびコントローラーは、throw Exceptionを介して上向きにスローされ、最後に、以下に示すように、springmvcフロントエンドコントローラーが例外処理のために例外プロセッサーに渡されます。
springmvcは、統一された例外処理のためのグローバル例外ハンドラー(システムには例外ハンドラーが1つしかない)を提供します。
カスタム例外クラス
さまざまな例外タイプの例外クラスを定義し、Exceptionを継承します。
public class CustomException extends Exception {
//异常信息
public String message;
public CustomException(String message){
super(message);
this.message = message;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
グローバル例外ハンドラー
アイデア:システムで例外が発生すると、プログラムで手動でスローされ、daoがサービスにスローされ、サービスがコントローラーにスローされ、コントローラーがフロントエンドコントローラーにスローされ、フロントエンドコントローラーがグローバル例外ハンドラーを呼び出します。
グローバル例外ハンドラーの処理のアイデア:
- 例外タイプを解析する
- 例外タイプがシステム定義の例外の場合、例外情報が直接取り出され、エラーページに表示されます。
- 例外タイプがシステム定義の例外でない場合は、カスタム例外タイプを作成します(メッセージは「不明なエラーです」)
public class CustomExceptionResolver implements HandlerExceptionResolver {
@Override
public ModelAndView resolveException(HttpServletRequest request,HttpServletResponse response, Object handler, Exception ex) {
CustomException customException = null;
if(ex instanceof CustomException){
customException = (CustomException)ex;
}else{
customException = new CustomException("未知错误");
}
//错误信息
String message = customException.getMessage();
ModelAndView modelAndView = new ModelAndView();
//将错误信息传到页面
modelAndView.addObject("message", message);
//指向错误页面
modelAndView.setViewName("error");
return modelAndView;
}
}
error.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>错误提示</title>
</head>
<body>
${message }
</body>
</html>
springmvc.xmlでグローバル例外ハンドラーを構成する
<bean class="cn.itcast.ssm.exception.CustomExceptionResolver "></bean>
コントローラ、サービス、DAOのいずれかで例外を手動でスローする必要があります。
プログラムで例外が手動でスローされた場合、カスタマイズされた例外情報がエラーページに表示されます。手動でスローされなかった場合は、ランタイム例外を意味し、エラーページに「不明なエラー」のみが表示されます。
ビジネス機能に関連する例外がある場合は、サービスで例外をスローすることをお勧めします。
ビジネス関数に関連しない例外は、コントローラーでスローすることをお勧めします。