抽象例外スーパータイプ


17

投げることSystem.Exceptionがとても悪いと考えられるなら、そもそもなぜException行わabstractれなかったのですか?

そうすれば、以下を呼び出すことはできません。

throw new Exception("Error occurred.");

これにより、派生した例外を使用して、発生したエラーに関する詳細を提供することができます。

たとえば、ライブラリのカスタム例外階層を提供する場合、通常、例外の抽象基本クラスを宣言します。

public abstract class CustomExceptionBase : Exception
{
    /* some stuff here */
}

そして、より具体的な目的を持ついくつかの派生した例外:

public class DerivedCustomException : CustomExceptionBase
{
    /* some more specific stuff here */
}

次に、ライブラリメソッドを呼び出すときに、この汎用try / catchブロックを使用して、ライブラリからのエラーを直接キャッチできます。

try
{
    /* library calls here */
}
catch (CustomExceptionBase ex)
{
    /* exception handling */
}

これは良い習慣ですか?

Exception抽象化された場合、良いでしょうか?

編集:ここで私のポイントは、例外クラスがマークされabstractていても、キャッチオールブロックでそれをキャッチできるということです。抽象化することは、プログラマが「スーパーワイド」例外をスローすることを禁止する方法にすぎません。通常、例外を自発的にスローする場合、例外のタイプとその理由を知る必要があります。したがって、より具体的な例外タイプをスローするように強制します。


3
+1 「不正使用を防ぐ最善の方法は、そのような使用を不可能にすることです。」- スコットマイヤーズ
スティーブンジュリス

3
「例外が抽象化された場合、良いでしょうか?」-まったくそうではありません。新しいException( "...")を使用する既存の.NETコードがすべて壊れるためです。ただし、「。NETチームは、例外を最初から抽象化する必要がありますか?」-おそらく、はい、しかし今では10年以上遅すぎます:)
MattDavey

回答:


11

私はそれがこのように行われた実際の理由を知りません。

しかし...小さなデモアプリや概念実証をコーディングするとき、10種類の例外サブクラスの設計を開始したり、状況に応じて「最良の」例外クラスを決定しようと時間を費やしたりしたくありません。むしろException、詳細を説明する文字列を投げて渡すだけです。使い捨てのコードの場合、これらのことは気にせず、そのようなことを気にせざるを得ない場合は、独自のGenericExceptionクラスを作成しどこにでも投げるか、別のツール/言語に移動します。一部のプロジェクトでは、関連する例外サブクラスを適切に作成することが重要ですが、すべてのプロジェクトがそれを必要とするわけではありません。


私はあなたに完全に同意しますが、質問は暗黙のうちに非自明なプロジェクトについて考えていました。
マルコ・fiset

3

可能性A:それは論理的に正しいです。

マイクロソフトは、他の多くの企業と同様に、さまざまnew Exception()な理由で直接投げることを提案していないことは間違いありません。

そうは言っても、Exceptionクラス階層の目的は狭義の効果を定義して、最も具体的な例外のみをキャッチできるようにすることであるという学問的な理想を考えることができます。(つまりArgumentNullException、よりも狭いArgumentException)。

Exceptionクラスは例外ではありません(意図しないしゃれです)。これは、可能な限り最も広い例外であることが意図されており、その範囲は無限に広いためほとんどキャッチできない「スーパー例外」です。「例外」はabstract、それ自体がエンティティとして存在することはできないという意味ではありません。(確かに良いケースはまだ定義されていません-可能性Bを参照してください)可能性があるため、公的に構築可能である必要があります。

'abstract'キーワード(純粋にアカデミックな意味)は、基本クラスがそれ自体で意味をなさない場合にのみ適用可能FourLeggedAnimalです。

念頭に置いてこのすべて、何もないでしょう技術的なクラスを作成する理由はabstract開発者に悪化の原因であることを他よりも

可能性B:デザインロックイン/知らなかった

MSがこのクラスを抽象化した場合、このクラスは言語の基礎に非常に不可欠であるため、将来的に考えを変えると問題が発生する可能性があります。彼らはすでにでバカにされApplicationExceptionていたので、将来的には推奨事項の変更も予測することは予見できます。(http://blogs.msdn.com/b/kcwalina/archive/2006/06/23/644822.aspxを参照)

他の理由があるかもしれません(これはReflectionに関係していると思われるか、他の技術的な理由があると思います)ので、この投稿をCWにしています。


「それが「スーパーワイド」だからといって、抽象的ではありません。」...しかし、それはOPの主張ですよね。例外のタイプの表示を常に渡す必要があるという意味で抽象的ではないはずです。
スティーブンジュリス

良い点は、それに応じて答えを更新します-「抽象的な」は言語キーワードであり、議論されている概念の名前でもあるため、この質問の性質は少しわかりにくいです。
ケビンマコーミック

@KevinMcCormick:ここでの「抽象」という用語は、言語キーワードとして使用されます。質問を変更して将来の読者にわかりやすくする方法を教えてください。
マルコ・fiset

素晴らしい質問だと思います。abstractキーワードに関するオブジェクト指向変換はすべてこの壁に当たります。abstractキーワードをバッククォートで示す以外に、それを回避する方法がわからない。
ケビンマコーミック

2
クラスを「抽象化しない」ことは、どのように破壊的な変化ですか?
コンフィギュレー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.