2011-11-09 7 views
0

最初は、実装の詳細を気にしたくない場合にクラスまたはライブラリが作成されますが、投げられる例外を適切に処理するためには、クラスの内部動作を知る必要があります。例外はカプセル化を中断しますか?

これはカプセル化と情報隠蔽の原則を破るものではありませんか?それとも、私はこれに完全に間違っていますか?

確かに、すべての例外を傍受する一般的なtry/catchブロックを使用できますが、それは間違いなく悪い習慣です。

例外が発生する可能性のある例外の詳細を知らなくても、どのように優れた例外処理戦略を考え出すことができますか?

答えて

2

うまく設計されたクラスまたはライブラリは、それがインターフェイスの一部として例外クラスの独自の階層を定義するようになっています。たとえば、fooサブクラスクラスは、ディスクがいっぱいの場合は "fooパーシスタンス例外"をスローし、ネットワークがダウンしている場合は別のサブクラスがスローします。呼び出し元として、データが保持されていないことが懸念されるため、foo永続例外をキャッチします。ディスクフル、ネットワークダウン、ディスクが存在しない、ディスク書き込みエラー、サブスペーストランシーバ干渉、& cのために特別にコードを書く必要はありません。

多くのことができない場合があります。まず第一に

0

これはそうではありません。エンド・プロダクトを使用しているエンド・ユーザー、または「内部実装を知る必要はありません」クラスのためのものですが、それを確実に理解し、それに応じてエラー・メカニズムを取り消すことができます。

これは、すべてのAPIに適切なドキュメントが付属している理由です。他の開発者には、少なくとも内部的な知識があることが分かります。

これにより、このアイデアがクリアされることを願っています。

2

クラスライブラリは、コードがスローするのと同じ例外をスローする必要はありません。内部的に処理することができない予想される例外については、APIのコンシューマが「未処理」例外を容易に理解できない代替の例外タイプにマップする必要があります。 API消費者は、期待される例外をAPIの出力として考えることができるべきである。一方、予期しない例外は、API開発者と消費者の両方にとってワックスのボールです。

0

適切に例外を処理するために、クラスの内部の仕組みを知っているあなたは は、実装の詳細について心配する必要はありませんが、その後、あなたが する必要がある場合は、クラスやライブラリが作成されます 投げる可能性があります。

これはカプセル化の原則を破らず、情報 が隠れていませんか?それとも、私はこれに完全に間違っていますか? caleeは、いくつかのランタイムエラーのためにその約束を果たすことができず、その状態から回復できない場合

例外がスローされる必要があります。スローされる例外は、インタフェース/ドキュメンテーションで指定する必要があります。私はこれがどのようにカプセル化を破るかは分かりません。一方、リターンコードを使用すると、明示的に無視することによっても、例外エラーを処理するように呼び出し元を強制することはできません。

確かに、すべての例外を傍受する汎用のtry/catchブロックを持つことができますが、それは間違いなく間違いです。

使用しているインタフェースの設計者が明確にスローされる可能性がどのような例外を指定しなかった場合、それはある

とによって/ what_function

それでは、どのように私は良い例外処理戦略を考え出すことができます 投げられるかもしれない各例外の詳細を知りませんか?

「詳細」は実際には例外の仕様であり、すべて知っておく必要があります。ここでも、ドキュメント/インタフェースの一部でなければなりません。

とにかく例外が起こることはめったにありません。おそらく誰かが例外に名前を付けたのでしょう。もしそれがあまりにも頻繁に起こるなら、誰かがそれらの例外をもはや「普通のもの」と名付けることはしないでしょう。普通の例外のない「コード」は例外になります:)

あなたはtry/bollocksをキャッチすると、そのコードに何か問題があります。

+0

例外を捕捉して続行する可能性がある場合、カスタム例外に巻き込まれずにラップされることなく、アプリケーションレイヤー間で例外が発生しないようにする必要があります。たとえば、IDictionary.Add実装の実行中にしばらく時間がかかるArgumentExceptionが呼び出し側に許可された場合、呼び出し側は(データ構造を変更せずに)呼び出しが拒否されたかどうかを知ることができませんキーがすでに存在しているか、辞書が部分的に実行され、変更されているか破損しているかどうかを示します。 – supercat

関連する問題