[解決済み】チェックされた例外とチェックされていない例外を選択する場合
質問内容
Java(またはチェックされた例外を持つ他の言語)で、独自の例外クラスを作成する場合、チェックするかしないかをどのように決定するのでしょうか?
私の直感では、チェックされた例外は呼び出し側が何らかの生産的な方法で回復できる可能性がある場合に呼び出され、チェックされていない例外は回復不可能な場合に呼び出されると思いますが、他の人の考えも聞いてみたいです。
どのように解決するのですか?
チェックされた例外は、それがいつ使用されるべきかを理解している限り、素晴らしいものです。JavaコアAPIはSQLException(そして時にはIOException)についてこのルールに従わないので、とてもひどいことになっています。
チェックされた例外 を使用する必要があります。 予測可能 しかし 防止できない というエラーは 回復のための合理的な .
チェックされていない例外 は、それ以外のものに使用する必要があります。
ほとんどの人がこの意味を誤解しているので、噛み砕いて説明します。
- 予測はできるが、防ぐことはできない : 呼び出し側は入力パラメータを検証するために全力を尽くしたが、呼び出し側の制御外の何らかの条件によって操作に失敗した。例えば、ファイルを読み込もうとしたが、ファイルが存在するかどうかを確認してから読み込み操作を開始するまでの間に誰かがファイルを削除してしまったとする。Checked exception を宣言することで、呼び出し側にこの失敗を予期するよう伝えることができます。
- 回復のための合理的な方法 : 呼び出し側に、回復できない例外を予期するよう指示する意味はありません。もしユーザーが存在しないファイルから読み込もうとしたら、呼び出し元は新しいファイル名を入力するように促すことができる。一方、プログラミングのバグ(無効なメソッド引数やバグだらけのメソッド実装)によってメソッドが失敗した場合、アプリケーションは実行の途中で問題を修正することはできません。できることは、問題を記録し、開発者が後でそれを修正するのを待つことです。
投げられている例外が すべて 上記の条件のうち、Unchecked Exceptionを使用する必要があります。
各レベルで再評価する : チェックされた例外をキャッチするメソッドが、エラーを処理する場所として適切でないこともあります。その場合は、自分の呼び出し側にとって何が妥当かを考えましょう。もしその例外が予測可能で、回避不可能で、呼び出し元が回復するのが妥当なものであれば、チェックされた例外を自分で投げるべきでしょう。そうでない場合は、その例外を未チェックの例外でくくるべきです。このルールに従えば、どの階層にいるかによって、チェックされた例外をチェックされていない例外に変換したり、逆にチェックされた例外をチェックされていない例外に変換したりすることに気がつくはずです。
チェックされた例外とチェックされていない例外の両方について。
適切な抽象化レベルを使用する
. 例えば、2つの異なる実装(データベースとファイルシステム)を持つコードリポジトリでは、実装固有の詳細を明らかにするために
SQLException
または
IOException
. その代わりに、すべての実装にまたがる抽象化で例外をラップする必要があります (例.
RepositoryException
).
関連
-
[解決済み] 午前0時からの時間を秒単位で取得する方法
-
[解決済み] JavaにおけるHashMapとHashtableの違いは何ですか?
-
[解決済み] Javaにおけるpublic、protected、package-private、privateの違いは何ですか?
-
[解決済み] JavaでArrayListではなくLinkedListを使用するのはいつですか?
-
[解決済み] 複数の例外を1行でキャッチする(ブロックを除く)
-
[解決済み] serialVersionUIDとは何ですか、またなぜそれを使用する必要がありますか?
-
[解決済み] 複数の例外を一度にキャッチする?
-
[解決済み] 最近のPythonでカスタム例外を宣言する適切な方法?
-
[解決済み] 例外を正しく無視する方法
-
[解決済み] Javaにおけるチェック済み例外とチェックされていない例外の理解
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] tempとは何ですか、またjavaにおけるtempの用途は何ですか?
-
[解決済み] maven. -source 1.5ではラムダ式がサポートされていません。
-
[解決済み] Java Genericメソッドをstaticにするには?
-
[解決済み] プロトコルハンドラの初期化に失敗しました。
-
[解決済み] java.lang.ClassNotFoundException: クラス com.ibm.db2.jcc.DB2Driver が Worklight プラットフォームまたはプロジェクトに見つかりませんでした。
-
[解決済み] raw 型のメンバへのアンチェックの呼び出し
-
[解決済み] HTTP ステータス 500 - サーブレットクラス pkg.coreServlet のインスタンス化に失敗しました。
-
[解決済み] IntegerからBigIntegerへの変換
-
[解決済み] x--やx++はここで何をするのですか?
-
[解決済み] Javaにおけるチェック済み例外とチェックされていない例外の理解