質問

カスタム例外をスローすべきですか?

例えば。私は、サーバーに接続するいくつかのコードを持っています。それが接続に失敗したときにサーバーに接続したコードは、IOExceptionがスローされます。それは呼ばれています方法の文脈では、これは大丈夫です。これは、ネットワークコードでも大丈夫です。

しかし、これはコネクションを持っていない(したがって、動作していない)を表すように例外は、UIまでのすべての道を行きます。この段階では、IOExceptionが非常に不明瞭です。 NoConnectionExceptionのようなものがよいでしょう。

だから、私の質問は: どのような段階ではあなたの代わりに、より良い抽象化に合う別(カスタム)例外をスローする例外をキャッチする必要がありますか?

役に立ちましたか?

解決

私は、例外は私が行うには、発信方法を尋ねてきたものの観点で話すことを期待します。例えばます。

read -> ReadException
connect -> ConnectException
buildPortfolio -> FailedToBuildPortfolioException

など。これは、(すなわち、あなたがソケットなどを経由して接続されている)カバーの下で何が起こっているか離れて抽象化します。 Iコンポーネントのためのインタフェースを作成する場合、原則として、私はしばしば、対応する例外を作成したり、例外のセット。私のインターフェイスは、Component呼び出されます、そして、私の例外は通常ComponentException(例えばRateSourceRateSourceException)です。それは完全なコンポーネントセットとして別のプロジェクトにエクスポートするために一貫して簡単です。

の欠点は、あなたが、例外のかなり多くを作成することで、あなたは翻訳のかなり多くを実行する必要があります。利点は、あなたがいない抽象漏れに少しを取得する(あなたが特定されてきたように)ということです。

(これと例外)メソッド呼び出しの階層中のある時点で、あなたは何の回復が行われていない(または、それが不適切な場所でだ)以降で処理される未チェック例外に変換できることを決定することができます。

他のヒント

私は、これは「言語に依存しない」としてタグ付けされたけど、私はそれが本当にあるとは思いません。 C ++の観点から来て、私は例外をスローすることは非常にいくつかの基本的な操作を期待する - C ++標準ライブラリは、ごく少数の場所で例外を使用しています。だから、私自身のコードでは、例外が発生することができ、多くの場合、最初の場所です。このコードでは、私は非常にフラットな階層が好き - 私は、後のコードでキャッチ何百もの()句をいじりしたくない、とクラスと名前空間のバロックheirarchiesを作成すると、JavaやC#の見かけの強迫観念を理解したことがありません<。 / P>

だから、私のC ++コードの - 例外の一つのタイプは、ライブラリごとに、意味のあるエラーメッセージを含みます。そして、最終的な実行のための1。

私はここに隠された二つの質問があると思います。 a)の場合は1が異なる例外の後ろに例外を隠す必要があります。 b)の場合は1本のカスタム例外を使用する必要があります。

A)私が言うと思います:例外は、アプリケーションで2層の国境を越えて移動するとき、これまでは、新しい層のためのより良いと考えている例外の後ろに隠れて取得する必要があります。 例:あなたは、いくつかのリモートのものをやっているので、あなたがConnectionWhatEverExceptionを取得

しかし、呼び出し側は、接続の問題を認識すべきではありません。以来、彼はいくつかのサービスが行わ取得したいので、彼はServiceOutOfOrderExceptionを取得します。その理由は次のとおりです。層の内部では、リモーティングをやって、あなたがにConnectionExceptionで何かを便利に行うことかもしれません(バックアウト・キューに書き込み、再試行します...)。あなたがその層を残したら、誰もにConnectionExceptionを処理する方法を知りません。しかし、彼らは、サービスが動作しない場合、何をしますか、決めることができる必要があります。

b)に該当する既存の例外が存在しない場合。例えばJavaで便利な例外がいくつかあります。私はかなり頻繁にIllegalStateとIllegalArgumentを使用しています。あなたが提供するいくつかの有用なコンテキストを持っている場合は、新しい例外クラスのための強力な引数が、あります。たとえば、失敗したサービスの名前はServiceFailedExceptionの引数である可能性があります。ただ、その旨をすべてのメソッド呼び出し、または何のためのクラスを作成しないでください。 100の例外クラスがあればそれらは異なる挙動(すなわち、少なくとも異なるフィールド)を有するように、問題はありません。彼らは名前だけが異なると同じ抽象化レベルに存在する場合、それらを一つの例外を作り、メッセージまたはその例外クラスの単一フィールドに別の名前をつけます。

c)少なくともJavaでチェック例外についての議論があります。私がチェックしたようなものを嫌うので、私は、未確認のいずれかに直接それらを包みます。しかし、それは、その後の助言より意見です。

あなたはIOの問題によって引き起こされていないNoConnectionExceptionになるだろうどのような場合はありますか?逆に、原因がIOをベースまたはクライアントが賢明回復を支援するつもりはないされているかどうかを知ることです?

  

カスタム例外をスローすべきですか?

I。とき、あなたはもっと(診断)情報を提供することができます。

注:この追加情報は、元の例外(IOExceptionを)がスローされた場所で使用できない場合があります。抽象化のプログレッシブ層は、あなたがこの例外につながったやろうとしたもののように追加するためのより多くの情報を持っていること?

II。あなたは、実装の詳細を公開してはならない時:つまり、あなたは(?のような錯覚を)したい抽象化を継続します。

基本となる実装メカニズムを変更することができたときに

これは重要であろう。カスタム例外では根本的な例外をラップする

(抽象化のレベルを持ち上げて)実装の詳細からあなたの顧客を絶縁する良い方法です

III。 IとIIの両方

注:また、あなたのクライアントは、彼らが興味を持っているかではなく、彼らは調子出て、彼らが興味を持っていない何かをすることができるはず情報の正確なレベルにチューニングすることができるはずそれからカスタム例外を派生することをお勧めしますので。 IOExceptionが。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top