例外処理ポリシーと再構築
例外処理ポリシー
システム異常は、ビジネスクラス異常とテクノロジークラス異常の2つに分類されます.ビジネスクラス異常は、その名の通り、ビジネスロジック処理時に発生する異常と理解できる.お客様の注文を作成したとき、このお客様に価格を設定していないことに気づきました.引き出しの場合、引き出し金額が勘定科目残高などより大きい.
技術類の異常はよりよく理解され、この層は技術者に関連しており、システム使用者にとって透明であるべきである.データベースに正しく接続できない場合.配列またはリストにアクセスすると、インデックスが範囲外になります.計算を行う場合、除数はゼロなどです.
異なるタイプの例外に対して、異なる処理ポリシーを採用します.次の表を参照してください.
予測可能な例外
予測不可能な例外
ビジネスクラス異常
異常発生箇所での処理ユーザに異常情報を表示する.
ログに記録しないでください
放出異常ユーザに異常情報を表示する.
ログに記録する技術類異常
異常発生箇所での処理ユーザに異常情報を表示するな.
ログに記録しないでください
放出異常ユーザに異常を表示するな.
ログに記録する
いじょうさいせい
異常再構築について話す前に、次のコードを見てみましょう.
FileWriterのwriteメソッド定義時にIOException例外を投げ出すと宣言したため、コンパイラは呼び出した場所でこの例外を処理しなければならないと要求します.
または、この例外をカスタマイズしたメソッドヘッダに明示的に宣言します.
または呼び出した場所でこの例外を処理します.
1つ目の方法では,異常をどのように処理するかはなく,try catch文を用いて異常をキャプチャし,todoと明記し,後日処理するが,時間が経つと忘れがちになる.一部のパートナーはcatch文で使用して例外を放出し続けると言う可能性があります.
このようなやり方は望ましくありません.これは問題を原点に戻すので、writeFileを呼び出す関数の中で私たちが投げた異常を処理しなければなりません.
第2の方法は,throw e異曲同工を用いることと同様に異常を処理せず,再び外部に伝達する.
この場合,異常処理の再構成を考慮する必要がある.まず、未処理の例外クラスを定義します.
次に、最初に述べたコードを次のように変更します.
これにより,迅速な開発の要求を達成できるとともに,後日この異常に対する処理を忘れないことを確保できる.
システム異常は、ビジネスクラス異常とテクノロジークラス異常の2つに分類されます.ビジネスクラス異常は、その名の通り、ビジネスロジック処理時に発生する異常と理解できる.お客様の注文を作成したとき、このお客様に価格を設定していないことに気づきました.引き出しの場合、引き出し金額が勘定科目残高などより大きい.
技術類の異常はよりよく理解され、この層は技術者に関連しており、システム使用者にとって透明であるべきである.データベースに正しく接続できない場合.配列またはリストにアクセスすると、インデックスが範囲外になります.計算を行う場合、除数はゼロなどです.
異なるタイプの例外に対して、異なる処理ポリシーを採用します.次の表を参照してください.
予測可能な例外
予測不可能な例外
ビジネスクラス異常
異常発生箇所での処理ユーザに異常情報を表示する.
ログに記録しないでください
放出異常ユーザに異常情報を表示する.
ログに記録する技術類異常
異常発生箇所での処理ユーザに異常情報を表示するな.
ログに記録しないでください
放出異常ユーザに異常を表示するな.
ログに記録する
いじょうさいせい
異常再構築について話す前に、次のコードを見てみましょう.
public void writeFile(String fileName, String data) {
FileWriter writer = null;
writer = new FileWriter(fileName);
writer.write(data);
}
FileWriterのwriteメソッド定義時にIOException例外を投げ出すと宣言したため、コンパイラは呼び出した場所でこの例外を処理しなければならないと要求します.
public void writeFile(String fileName, String data) {
FileWriter writer = null;
try {
writer = new FileWriter(fileName);
writer.write(data);
} catch (IOException e) {
//todo
}
}
または、この例外をカスタマイズしたメソッドヘッダに明示的に宣言します.
public void writeFile(String fileName, String data) throws IOException {
FileWriter writer = null;
writer = new FileWriter(fileName);
writer.write(data);
}
または呼び出した場所でこの例外を処理します.
1つ目の方法では,異常をどのように処理するかはなく,try catch文を用いて異常をキャプチャし,todoと明記し,後日処理するが,時間が経つと忘れがちになる.一部のパートナーはcatch文で使用して例外を放出し続けると言う可能性があります.
public void writeFile(String fileName, String data) {
FileWriter writer = null;
try {
writer = new FileWriter(fileName);
writer.write(data);
} catch (IOException e) {
throw e;
}
}
このようなやり方は望ましくありません.これは問題を原点に戻すので、writeFileを呼び出す関数の中で私たちが投げた異常を処理しなければなりません.
第2の方法は,throw e異曲同工を用いることと同様に異常を処理せず,再び外部に伝達する.
この場合,異常処理の再構成を考慮する必要がある.まず、未処理の例外クラスを定義します.
/**
*
* @author Chris Mao(Zibing)
*
*/
public class UnhandledException extends Exception {
private Exception exception;
private String message;
/**
*
*/
private static final long serialVersionUID = 3490319235806360289L;
public UnhandledException(Exception e, String message) {
this.exception = e;
this.message = message;
}
public Exception getException() {
return exception;
}
public String getMessage() {
return message;
}
}
次に、最初に述べたコードを次のように変更します.
public void writeFile(String fileName, String data) throws UnhandledException {
FileWriter writer = null;
try {
writer = new FileWriter(fileName);
writer.write(data);
} catch (IOException e) {
throw new UnhandledException(e, " , ");
}
}
これにより,迅速な開発の要求を達成できるとともに,後日この異常に対する処理を忘れないことを確保できる.