6

特定の例外を無視するコードがあります。

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 は使用されていないため、コンパイル時に警告が表示されます。この警告を削除するために使用する必要がある標準の accept noop はありますか?

4

6 に答える 6

12

のように書き換えるだけです。

catch (UnauthorizedAccessException) {}
于 2008-10-24T02:59:47.460 に答える
2

Dave M. と tvanfosson が言ったように、次のように書き直します。

catch (UnauthorizedAccessException) {}

ただし、より大きな質問は、例外を無視して例外をキャッチする理由です (一般に、例外を飲み込むと呼ばれます)。これは、実行時にアプリケーションの問題を隠すことができる (そして通常はそうする) ため、一般的には悪い考えです。

于 2008-10-24T03:11:06.187 に答える
1

単に例外を無視するのはおそらく悪い考えだと言う人々に同意します。再スローしない場合は、少なくともどこかにログを記録してください。個々のファイルのエラーがプログラム全体をクラッシュさせたくないファイルのリストを処理する小さなツールを作成しました。そのような場合、スキップされたファイルを確認できるように警告メッセージを出力しました。

個人的には、catch(xxxException) のように名前を付けずに例外をキャッチするのは、何らかの方法でそれに反応してから再スローして、外部ルーチンでキャッチできるようにする場合だけです。例えば:

try
{
    // do something
    // ...
}
catch(UnauthorizedAccessException)
{
    // react to this exception in some way
    // ...

    // let _someone_ know the exception happened
    throw;
}
于 2009-06-02T01:16:12.860 に答える
1

私は通常そうします

Debug.WriteLine(ex.message)

(そうすれば、必要に応じて、例外にブレークポイントを設定することもできます)

于 2008-10-24T03:06:26.617 に答える
1

元のコードのコメントが何をしようとしているかの正確な説明であると仮定すると、次のように書きたいと思います。

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 アイテムに取り組む必要があります。

于 2008-10-24T07:29:36.027 に答える
-1

私は Java 開発者 (C# ではない) ですが、@Scott Dorman は絶対に正しいです。なぜ「例外を飲み込む」のですか?さらに良いことに、何UnauthorizedAccessException をスローする可能性があるのでしょうか? 常識的な可能性は次のとおりです。

  1. ファイルが存在しません
  2. ディレクトリが存在しません
  3. 現在の制御スレッドには、正しいセキュリティ権限がありません。*nix の世界では、現在のスレッドが間違ったグループまたは間違ったユーザーに属している可能性があります。
  4. ディスクがクラッシュしました
  5. ファイルの ACL は書き込み専用に設定されていますが、読み取りには設定されていません。ディレクトリについても同様です。

もちろん、上記は不完全なリストです。

于 2008-10-24T03:56:09.467 に答える