2010年09月07日

ApplicationExceptionが推奨されない理由  

   このエントリーをはてなブックマークに追加 mixiチェック Clip to Evernote
Ognacの雑感 − ApplicationException は非推奨です で話題になっている、ApplicationExceptionですが、

MSDNの「CA1058: 型は、一定の基本型を拡張することはできません」 のページには、
.NET Framework Version 1 では、ApplicationException から新しい例外を派生することが推奨されていました。この推奨事項は変更されました。新しい例外は、System.Exception または System 名前空間のサブクラスの 1 つから派生する必要があります。

と記載があります。このとおり、マイクロソフトはApplicationExceptionの利用を推奨していません。

その理由ですが、.NET Framework の中で、ApplicationExecptionが設計者の意図に反した使い方がされているからだと思われます。

msdn で ApplicationException のページを開いてもらえばお分かりになりますが、 なぜか、.NETFrameworkで、このApplicationExceptionを継承している例外クラスがあります。



空いた口が塞がらない、というのはまさしくこのことです。
ApplicationExecptionが完全に破たんしていることがわかります。
これは、バグと言っても良いと思います。

Microsoftの人も ApplicationExceptionを理解しないでコードを書いてしまった人がいるってことですね。

もし、ApplicationExceptionを直接throwした場合や、独自例外を ApplicationExceptionから派生させた場合、
ApplicationExceptionをcatchしてしまうと、上記例外との区別がつかなくなってしまいます。

ApplicationExceptionをcatchせずに、その派生クラスをcatchするようにすれば、回避できますが、
それよりは、ApplicationExceptionを使わないようにしたほうが良いと思います。


この記事へのコメント
この問題は.NET 2.0開発中にすでにMSは気づいていたと思われますが、
なぜApplicationExceptionが使用されている部分が修正されずにそのままになっているんでしょうか?
(互換性の問題?)

WaitHandleCannotBeOpenedExceptionなんかは.NET2.0で追加されたようですが、
さらに問題部分を増やしているような・・・
Posted by bkmt at 2010年09月08日 21:41
きっと、互換性の問題で変更出来ないんでしょうね。
MSの立場からすると、ドキュメントに記載してしまったということは、
仕様であり、バグではない、という位置づけなんだと思います。
でも、新たにクラスを増やしてしまうのは....
Posted by Gushwell at 2010年09月08日 22:29
.NET 2.0 当時の解説には、
「ApplicationException は、共通言語ランタイムではなく、ユーザー プログラムによってスローされます。デザインしているアプリケーションで固有の例外を作成する必要がある場合は、ApplicationException クラスの派生クラスを生成します。」
とあって、2.0の途中から方向変換したんですかね。
Posted by BLUEPIXY at 2010年09月09日 18:22
どうなんでしょう。ApplicationExceptionが推奨されないのを知ったのは
随分前なので、そのあたりになると、記憶があやふやです。
すくなくとも VS2008よりも前だったのは確かですから、
.NET2.0の途中で変わったのかもしれませんね。
Posted by Gushwell at 2010年09月09日 22:52
 

この記事へのトラックバックURL

http://trackback.blogsys.jp/livedoor/gushwell/52066513
この記事へのトラックバック
素敵なエントリーの登録ありがとうございます - .NET Clipsからのトラックバック
ApplicationExceptionが推奨されない理由:窓際プログラマーの独り言 -C#の話題を中心に【.NET Clips】at 2010年09月09日 00:36