C#でどの関数が例外を返す可能性があるかを自動的に確認する方法
質問
例外が発生し、それを試行/キャッチしなかったメソッドでデバッガ内でコードがクラッシュするのを見ることほどイライラすることはありません。
ソースをスキャンして、例外をスローする可能性のあるすべての関数にタグを付ける簡単な方法はありますか?
ビルトインのビジュアルアシストには、これらの機能を特定の色で色付けするための隠れたオプションはありますか?
ありがとう
R
解決
私はレッドゲートは、この「例外ハンター」のためのいくつかのツールを持っていると思います 彼らは裁判の後にそれのために充電します。
http://www.red-gate.com/products/Exception_Hunter /index.htmする
他のヒント
すべてのコードが、ほとんどの些細なは(少なくとも、メモリ不足の)例外をスローすることができます。あなたは、おそらく、少なくとも世界のtry / catchではなく、コードのセクションは、または例外がスローされませんであろうmicromanageしようと、守備あなたのコードを書く方がいいでしょう。
いいえ、これを自動的に行う方法はなく、メソッドによってスローされる可能性のあるすべての例外のリストを取得する良い方法もありません。その理由をいくつかご紹介します
- StackOverflowException などの暗黙的にスローされる例外は、どのメソッドからもいつでもスローされる可能性があることを考慮してください。CLR 内のどのメソッドでもこれらのタイプの例外をスローできると想定する必要があります。
- リフレクションやデリゲートは、特定のメソッドで呼び出される実際のコードを隠す可能性があるため、メソッドのすべての可能なコード パスを検査することはできません。
- これには、IL と IL を検査する必要があります。メタデータ。
- .Net では、API によって明示的にスローされる例外を文書化する必要はありません。
他の人が言ったように、私はあなたがチェック例外をサポートしていないので、C#でこれを行うの確実な方法を見つけることができますかはわからない。
脇のビットのように、これは「を議論アンダース・ヘルスバーグとのインタビューを思い出しましたのチェック例外」とのトラブル。私は炎が例外を確認しようとしていますが、C#の例外設計と例外を処理するための提案方法の背後にあるAnderの根拠読むことを示唆していないよ:。集中型の例外処理を
私はReSharperのはあなたの例外のヒントを与えると思います。しかし、原因C#はチェック例外をサポートしていないことを理由に、例外を決定する方法があります。たぶん、NDependのようなコード分析ツールは、これをサポートしています。
すべてが例外をスローすることができます。メソッドによってスローされる例外のリストについては、MSDNをチェックします。
すべての空でない方法は、1つのフォームまたは別で例外を投げることができます。
:あなたが個人的に生成した例外を懸念している場合は、このように、フレームワークのメソッドは、XMLドキュメントを経由して行うのと同じ方法で、インテリセンスからそれらを表示することができます/// <summary>
/// I seem to have written a method to do a thing.
/// </summary>
/// <exception cref="System.Exception">An unfortunate failure.</exception>
public void DoSomething()
{
/* ... */
}
任意のコードが潜在的にそれを試してみて、これを予測するためにあなたの仕事である例外を引き起こす可能性があります!
の提案をすることができ、そのようなリファクタリングなど、いくつかの一般的なエラー例えばFxCopのとツールを見つけることを支援するサードパーティ製のツールがいくつかあります。
の潜在的な例外を見つけることを支援することができた瞬間に行われていくつかの作業があります。あなたの機能のためのテストを生成することができますPEXに見てみましょう:research.microsoft.com/en-us/projects/Pex/(リンクは投稿の時点でダウンしているようです)。
他の刺激的な領域は、コード契約(仕様#として利用できる.NET 4 /入ってくる)です。コードの契約は、あなたが満たされなければならない条件を指定する文を書くことができます。これらは、前にと呼ばれている、あなたの関数の後にすることができます。また、不変条件を宣言することができます。条件は値!= nullのような単純なものかもしれません。これらの条件は、その後何のコードパスがそれらに違反していない確認するために、コンパイルおよび実行時に分析されます。
他の人が言ったように、あなたはそれができないことを証明していない限り、コードのすべての単一の行は、例外を投げることができることを前提とすべきです。より良い質問は、「あなたはそれをどうする予定ですか何?」、である。
一般的に、あなたはすべての例外をキャッチするべきではありません。
もちろん、他のすべては、そのルールの例外です。これは、(ASP.NETがするようにご使用の環境が、あなたのためにそれをしない場合)、それを記録するために、例外をキャッチすることは理にかなって。これは、コンテキストに関するより詳細な情報を提供する別の例外を除いて、それを交換するために、例外をキャッチすることは理にかなっています:
public int GetConfiguredInteger(string name) {
string s = null;
try {
s = GetStringFromConfigFile(name);
}
catch (IOException ex) {
throw new Exception(String.Format(
"Error in configuration file foo.config when processing {0}", name),
ex);
}
return int.Parse(s);
}
呼び出し側は、あなたがそれらを告げていなかった場合IOExceptionが設定ファイルによって引き起こされたことは知られていませんでした。私は、ファイルI / Oに関連していないすべての例外を無視する方法にも注意してください。特に、int.Parseもtry / catchブロックの内側ではないことに注意します。
他にもこのような例外の数が少ないですが、例外をキャッチするの基本的な考え方は次のとおりです。あなたがしなかった場合、それは悪いことない限りそれをしない
例外ファインダー例外は、メソッドによってスローされることができるものが表示されます。私はそれを使用するが、ネットユーザーグループの会合で、それの例を見ていない。
これを行うことができますそこにツールがあります。あなたは試用版をダウンロードし、あなたがそれを好きかどうかを確認できます。私は本当にそれが必要であろうとは思わないが、あなたが会社のために働いていると、彼らはそれを支払うだろう場合、あなたはそれに見たいと思うかもしれません。等が提起され、あまりにも多くの可能な例外がある前に言われています。チェックアウト Excpetionハンターのnoreferrer"
例外ハンターはこれを支援するための優れたツールです。私はあなたのコードによってスローされた例外のドキュメントを強制することができるように、それはタイで<exception>
のXML-docコメントとを有しているかどうかわかりません。
私は、外側の catch ブロック内に侵入して、例外が発生した実際のポイントまで掘り下げるほうがはるかにイライラします。
予期していなかった例外がスローされた場合、ほとんどの場合、バグが見つかりました。何もしない例外処理によって難読化されていなければ、解決するのが簡単です。
編集:あなたの例は実際には良い例なので、そのようなツールが役立つかどうかはまだ確信がありません。文字通りコードのすべての行がスローする可能性のある例外が非常に多く、「興味深い」例外を見つけるのは困難です。