Application Exception

社員に例外処理をより深く理解してもらう文書を検索していた過程で、個人的にはかなりショッキングな代物を見つけてしまった。

Microsoft公式文献

標準の例外の種類のキャッチとスロー

http://msdn2.microsoft.com/ja-jp/library/ms229007(VS.80).aspx

ApplicationException
System.ApplicationException をスローしたり、System.ApplicationException から派生したりしないでください。

!?

カスタム例外のデザイン

http://msdn2.microsoft.com/ja-jp/library/ms229064(VS.80).aspx

System.Exception または他の一般的な基本例外のいずれかから例外を派生させます。

「標準の例外の種類のキャッチとスロー」のガイドラインに示されているように、ApplicationException からカスタム例外を派生させることは推奨されていない点に注意します。

!?

ApplicationException クラス

http://msdn2.microsoft.com/ja-jp/library/system.applicationexception(VS.80).aspx

ApplicationException は、共通言語ランタイムではなく、ユーザー プログラムによってスローされます。デザインしているアプリケーションで固有の例外を作成する必要がある場合は、ApplicationException クラスの派生クラスを生成します。ApplicationException クラスは Exception を拡張しますが、新しい機能は追加しません。この例外は、アプリケーションで定義された例外とシステムで定義された例外を区別する手段として提供されます。

!??

十分に調節された例外

http://www.microsoft.com/japan/msdn/columns/csharp/csharp08162001.aspx

すべての例外クラスは "Exception" という単語で終わり、 ApplicationException クラスから派生する必要があります。 これは厳密な必要条件ではないので、 この条件に従わなくても機能しないわけではありません。 ただし、この必要条件に従うとほかの人があなたの記述したコードを保守することがより簡単になります。 例外クラスの基本的なアウトラインは次のようになります。

!?!?

他記事

律儀に以前の情報を信じてApplicationExceptionから派生していたさ。
混乱してきたので調べて見る。

C# と 諸々

http://csharper.blog57.fc2.com/blog-category-1.html

Microsoftは以前、アプリケーション固有の例外はApplicationExceptionから派生させることを推奨していました。しかし、現在はこれを推奨していません。変わりにExceptionから派生させることを推奨しています。


なぜでしょうか?これは、Microsoftに原因があります。
Microsoftはこのようなルールを推奨しようとしていました。

  • CLRがスローする例外は SystemException クラス (System) 派生の例外
  • アプリケーションがスローする例外は ApplicationException クラス (System) 派生の例外

しかし、.NET Framework クラスライブラリ ( 以降、FCL ) 自身がこのルールを守れなかったのです。実は、FCLに用意されている例外の中には、ApplicationExceptionから派生しているクラスや、Exceptionクラスから直接派生しているクラスが紛れ込んでいます。FCLがルールを守れていない以上、このルールはもう台無しです。ApplicationExceptionから派生させる意味はなくなります。

おい、おい、おい、おい。
なんの冗談だ。
意味が無かろうがなんだろうが、ルールをひっくり返すなと。そのままにしとけばいいんじゃないのかよ。
FCLのバグならFCLが将来直せばいいだけの話でしょう。
まだなんか理由がありそうだと思ったので、もう少し調べて見る。

blog.C#

http://shinshu.fm/MHz/95.83/archives/0000127004.html

.NET 1.x ではアプリケーション定義の例外は ApplicationException から派生させるというガイドラインが出ていたが、 .NET 2.0 においては Exception から直接派生するようにされている。
「プログラミング .NET Framework 」によれば、 SystemException と ApplicationException を各例外の基底型とすることにはあまり意味を感じないと書かれており、むしろ混乱するとも書かれている。
そこで、Microsoft も方針を切り替えたようだ。

混乱しながら対応していましたよ。

DirectXExceptionとか

はいはい、そういうことならわかりましたよ、と。
つまりExceptionを継承したApplicationごとのBaseException作って、それをApplicationExceptionごとに使えっていうのが「新しい指針」な訳ですかね、と。
ちなみにDirectXExceptionは、
http://msdn.microsoft.com/archive/default.asp?url=/archive/en-us/directx9_m_Oct_2004/directx/ref/ns/microsoft.directx/c/directxexception/directxexception.asp
http://msdn2.microsoft.com/en-us/library/microsoft.windowsmobile.directx.directxexception.aspx
WindowsMobileのDirectXExceptionはExceptionから派生で、普通のだけApplicationExceptionから派生しているらしい。

FxCop

楽しいなオイ。
何を信じていいのか訳がわからんぞ。
とりあえず、ApplicationExceptionは使わなくていいのね。
それが正しいんだね。
信じていいんだね。
FxCopが先走っているだけじゃないよね。
http://msdn2.microsoft.com/en-us/library/8446ee40-beb1-49fa-8733-4d8e813471c0(vs.80).aspx
※要約:ApplicationExceptionから派生した例外を作ったら規則違反だよ。Exceptionから派生したの作ってね。

とりあえず

・・わからん。
・・・わからんが、ApplicationExceptionの使用はとりあえずやめておくか・・。
Base作れば実装者としては同じだし、別にいいんだけどさ。
社員に模範ケースを示さなければならない立場ではきついんだよね。
ApplicationExceptionから派生してね、とは言ってなかったけど、ApplicationExceptionから派生したのを作って渡してしまった上、例外の使い方がなってないぞボケェと偉そうに言ってしまった後なわけで。
あんたの方こそなってないよね、ふふ、と言われる様子が目に浮かぶ。
コーディング規約をいきなりガチガチにするときついからって、FxCop等を使わなかったのがまずかったか。


ApplicationExceptionの利用は便利そうに見えたけど、Microsoft側でも統一できてないし、統一できてないから混乱するだけだし、単純に階層深くするだけでシリアライズ時等で肥大化するからやめようぜって事かな。
勘弁してくれ。