質問
特定の例外を無視するコードがあります。
try
{
foreach (FileInfo fi in di.GetFiles())
{
collection.Add(fi.Name);
}
foreach (DirectoryInfo d in di.GetDirectories())
{
populateItems(collection, d);
}
}
catch (UnauthorizedAccessException ex)
{
//ignore and move onto next directory
}
もちろん、exは使用されないため、コンパイル時に警告が表示されます。この警告を削除するために使用する必要のある標準の受け入れnoopはありますか?
解決
次のように書き直してください
catch (UnauthorizedAccessException) {}
他のヒント
Dave M.とtvanfossonが言ったように、あなたはそれを次のように書き直したいです
catch (UnauthorizedAccessException) {}
ただし、質問すべき大きな質問は、なぜそれを無視して例外をキャッチしているのかということです(通常、例外の嚥下と呼ばれます)。これは、実行時にアプリケーションの問題を隠し、非常に奇妙な結果を導き、デバッグするのに苦労する可能性があるので、通常は悪い考えです。
通常は
Debug.WriteLine(ex.message)
(必要に応じて、例外にブレークポイントを設定するだけです)
元のコードのコメントがあなたがやろうとしていることの正確な説明であると仮定すると、私はあなたがそれを次のように書きたいと思うと思います:
foreach (FileInfo fi in di.GetFiles())
{
//TODO: what exceptions should be handled here?
collection.Add(fi.Name);
}
// populate collection for each directory we have authorized access to
foreach (DirectoryInfo d in di.GetDirectories())
{
try
{
populateItems(collection, d);
}
catch (UnauthorizedAccessException)
{
//ignore and move onto next directory
}
}
そして、そのTODOアイテムに取り組む必要があります。
例外を単に無視することはおそらく悪い考えだと言う人々に同意します。再スローしない場合は、少なくともどこかにログを記録してください。個々のファイルのエラーがプログラム全体をクラッシュさせたくないファイルのリストを処理する小さなツールを作成しました。そのような場合、警告メッセージを出力してスキップされたファイルを確認します。
catch(xxxException)のように、個人的に例外を命名せずにキャッチするのは、何らかの方法でそれに反応し、それを再スローして、いくつかの例外をキャッチできるようにする場合です外部ルーチン。例:
try
{
// do something
// ...
}
catch(UnauthorizedAccessException)
{
// react to this exception in some way
// ...
// let _someone_ know the exception happened
throw;
}
私は(C#ではなく)Java開発者ですが、@ Scott Dormanは絶対に正しいです。なぜ「例外を飲み込む」のですか?さらに良いのは、UnauthorizedAccessExceptionをスローする ものは何ですか?常識的な可能性を次に示します。
- ファイルが存在しません
- ディレクトリが存在しません
- 現在の制御スレッドには、正しいセキュリティ特権がありません。 * nixの世界では、現在のスレッドは間違ったグループまたは間違ったユーザーに属している可能性があります。
- ディスクがクラッシュしました
- ファイルのACLは書き込み専用で読み取り専用ではないように設定されています。同様に、ディレクトリに対しても。
もちろん上記は不完全なリストです。