トビーのスプリングStudio(4)-例外
4.1消えたSQLException
恥ずかしい異常処理(1)
try{
...
}catch(SQLException e){
} // 예외를잡고 아무것도 하지않는 처리방식
例外が発生しても無視されるので、例外が発生するよりも状況が悪い.システムエラーや奇妙な結果が出る可能性があり、原因を特定するのは難しい.
気まずい異常処理方法(2,3)
try{
...
}catch(SQLException e){
System.out.print(e)
}
try{
...
}catch(SQLException e){
e.printStackTrace();
}
他のログまたはメールで上書きされる可能性がありますすべての例外は、適切なリカバリ、中断、オペレータまたは開発者に明確に通知する必要があります.
それを投げ出したほうがいい.
スタック領域のスタックをスタックしてポップアップしてスタックフレームを出力
無意味で無責任なthrows
public void method1() throws Exception{
method2();
}
public void method2() throws Exception{
method3();
}
public void method3() throws Exception{
...
}
何が起こるかに関する有意義な情報は得られません.リカバリ可能な例外の処理に失敗しました
いじょうでんぱ
メソッドエラー
メソッドは、エラー情報、タイプ、およびポイントを含むオブジェクトを作成し、ランタイムシステムに渡します.そしてこれを例外と形容します.
メソッドが異常を投げ出すと、ランタイムシステムは異常を処理するものを探してみます.
画像ソース:https://docs.oracle.com/javase/tutorial/essential/exceptions/definition.html
Call stack=例外が発生したメソッドのリストを呼び出す
エラーが発生したメソッドを達成するためにcallスタックを使用して到着します.
画像ソース:https://docs.oracle.com/javase/tutorial/essential/exceptions/definition.html
ランタイムシステムは、エラーメソッドから呼び出された逆シーケンスcallstackに従って、異常を処理できるコードを決定します.
適切な例外処理ハンドルが見つかった場合、実行時にシステムは例外をハンドルに渡します.
Exceptionを扱うHandlerが見つかるまで上流に転送されます.
最後のプライマリ・エラーから最後のプライマリ・エラーに移行したら?スタックトラッキングを表示し、スレッドを閉じます.
例外処理コスト
checked , unchecked exception
エラー(システムに異常が発生)
ソース:https://madplay.github.io/post/java-checked-unchecked-exceptions
Exception,checked exception(アプリケーションコードの動作異常)
Checked Exception=ExceptionのサブクラスにException(RuntimeExceptionを除く)のExceptionが継承されている
主に外部の影響によるものであり,プログラム利用者の動作によって生じることが多い.
コンパイル時に表示できる例外
(FileNotFoundException、ClassNotFoundException、DataFormatExceptionなど)
コンパイル時に確認するには、直ちに異常処理を行う必要があります.
Unchecked Exception=RuntimeExceptionが継承するException、Error、およびサブクラス
通常は、予知不可能およびリカバリ不可能な例外です.主に外部APIの使用,プログラミングエラーなどを示す.
(ArrayIndexOutOfBoundsException, NullPointerException,ClassCastException, ArithmeticException)
=タイル範囲外でnullの参照変数を呼び出し、実数を変換し、整数を0で割る
2つの明確な基準は、処理しなければならないか、処理しないかの違いです.
Checked Exceptionが発生する可能性のあるメソッドはtry~catchで包むか、throwで処理する必要があります.
逆に、Unchecked Exceptionでは明示的な例外処理は不要です.
Javaでchecked、unchecked exceptionを分割する理由
https://docs.oracle.com/javase/tutorial/essential/exceptions/runtime.html
メソッドを呼び出す側は、メソッドにどのような例外が発生する可能性があるかを理解する必要があります.
したがって、javaはchecked exceptionによって、このメソッドに発生する可能性のある異常を強制的にリストします.
RuntimeExceptionでは異常の原因を説明する必要はありません
コードを記述する開発者のミスによる例外はRuntimeExceptionであるため,クライアント側(メソッド呼び出し)がリカバリしたり対応したりできるとは予想し難い.また,RuntimeExceptionはどこでも非常に頻繁であるため,すべてのRuntimeExceptionにメソッドで宣言を強制することはプログラムの明確性を低下させる可能性がある.
クライアントが例外をリカバリできると予想している場合は、checked exceptionに設定したほうがいいです.そうしないと、unchecked exceptionに設定します.
例外処理方法
リカバリ例外
IOException->ユーザーが別のファイルを使用して例外を解決するようにユーザーに指示します.ユーザーファイルを読み込めないためです.
例外をリカバリできる場合は、リカバリできる数を再試行します.
例外を回避
呼び出しの側に自分を投げつける方法、またはcatch文を使用して例外をキャプチャし、ログを保持して再び例外を投げ出す方法.
理由もなく投げ出すのは無責任な回避かもしれない.意図は明確にしなければならない.他のオブジェクトに異常を処理する責任を明確にさせなければならない.
変換例外
SQLExceptionが発生しているが、なぜSQLExceptionが発生し、ログイン名の重複エラーが発生しているのか分からない場合は、DuplicateUserIdExceptionなどの異常に切り替えて投げ出す
復旧できない異常の場合は、運転時異常としてパッケージして捨て、詳細なログを残し、管理者にメール通知を送信し、ユーザーに親切な情報を送信することが望ましい.
処理できない例外については、uncheckedexceptionにすばやく送信してください.機械で投げるな.
4.2変換異常の目的
JDBC制限
非標準SQL
lowの開始位置、数、またはクエリーに含まれる条件を指定して
=>SQLごとに異なるコードが記述され、特定のDBのスレーブコードとなる.
SQLException
ORMで発生するが、JDBCで例外がない場合にも階層化が行われている.
SpringのDataAccessExceptionはSQLEExceptionをUnchecked Exceptionに変更し、不要なthrows文、DBコンテキストエラー、およびORMのみで発生する異常を低減します.
SQLExceptionとは異なり、複数のサブクラスが特定の項目を表す.
例外をより正確に伝えることができ、回復できるものをつかむことができます.
try {
//do data operation using JDBC abstraction layer
} catch (DatalntegrityViolationException ex) {
// Apply recovery strategy
}
JDBCロジックtryにアクセスし、リカバリポリシーのcatchロジックを記述できます.try {
//do data operation using JDBC
} catch (SQLException ex) {
boolean recovered = false;
String sqlstate = sqlex.getSQLState();
if (sqlstate != null) {
String classCode = sqlstate.substring(0, 2) ;
if ("23".equals(classCode) ||"27".equals(classCode) ||
"44".equals(classCode)) {
// Apply recovery strategy
recovered = true;
}
}
if (!recovered)
throw new ApplicationSpecificExceptionf("Other SQL exception", ex);
}
SQLステータス文字列を確認する方法のみです.コードでも足りない.各RDBMSの実装オプションを考慮すべきである.
Reference
この問題について(トビーのスプリングStudio(4)-例外), 我々は、より多くの情報をここで見つけました https://velog.io/@dudwls0505/토비의스프링-Study4-예외テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol