3

vs 2010またはサードパーティアプリケーションで、メソッドがスローできるすべての可能な例外に対して「キャッチ」を自動生成する方法はありますか?

たとえば、「Directory.CreateDirectory」を使用すると、次のものが自動的に作成されます。

try
{
 Directory.CreateDirectory("blabla");
}
catch (PathTooLongException)
{}
catch (DirectoryNotFoundException)
{}
catch (IOException)
{}
catch (ArgumentNullException)
{}
catch (UnauthorizedAccessException)
{}
4

2 に答える 2

1

コード内の未処理の例外を検出するツールがあります: Exception Hunter by Red Gate software

結局のところ、彼らはそれを中止しました:

.NET 4.0 と WPF のリリースにより、CLR がスローできる例外の数が大幅に増加し、圧倒されるほどになりました。除外リストは、CLR がスローする可能性が低いすべての例外をカバーすることはできなくなりました。つまり、Exception Hunter は正確な結果を提供しますが、これらの結果には潜在的な例外の長いリストが含まれ、そのほとんどは心配する必要がありません。

これは、「メソッドがスローできるすべての例外をキャッチする」ことが悪い考えである可能性があることを示しているはずです。通常のパターンは、グローバルなキャッチオールを持つことです

try {
    ...
} catch (Exception ex) {
    logAndShowErrorMessage(ex);
}

ユーザー インターフェイス (WinForms) のトップレベルでのみ、または専用メソッド (WPF: Application.DispatcherUnhandledException、WebForms: Application.Error ) でエラーを処理します。

この例外の発生が予想される例外的なケースでのみ、例外をコードで直接処理し、この例外を具体的に処理する方法と、その後プログラムの実行を続行する方法を知っています。


補足として: あなたが望むものは、" checked exceptions "と呼ばれる Java 機能と非常によく似ています: 例外を処理するか、メソッドが例外を再スローすることを宣言する必要があります。次の質問は、C# の設計者が意図的にこの機能を含めないことを選択した理由を説明しています。

于 2012-04-24T05:11:49.790 に答える
0

例外を黙って無視することは非常に悪い習慣です。したがって、もちろん、空のボディでキャッチを自動生成する方法はありません。また、メソッドがどの例外をスローできるかは不明です。これは、C# では関数がスローする可能性のある例外を宣言しないためです (Java などとは対照的に)。

それでもすべての例外を無視したい場合は、すべての例外が基底クラスcatch(Exception)から継承されるため、すべての例外をキャッチする と書くことができます。Exceptionしかし、起こりうるすべてのことを黙って無視することは良い考えだと思いますか? ユーザー (または呼び出し元) に、予期された作業を黙って実行しないのではなく、何か問題が発生したことを知らせる方が適切です (たとえば、Directory.CreateDirectoryディレクトリの作成に成功したか、またはディレクトリの作成に成功したかどうかわからないように、そのように動作する場合を想像してください)。そうでない場合、その理由は何ですか。

于 2012-04-24T04:56:27.730 に答える