忽略异常

时间:2008-10-24 02:58:03

标签: c# exception-handling

我有一些忽略特定异常的代码。

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应该用于删除此警告?

6 个答案:

答案 0 :(得分:12)

只需将其重写为

catch (UnauthorizedAccessException) {}

答案 1 :(得分:2)

正如Dave M.和tvanfosson所说,你想把它重写为

catch (UnauthorizedAccessException) {}

然而,应该问的更大的问题是,为什么你会忽略它(通常称为吞咽异常)?这通常是一个坏主意,因为它可以(并且通常会)在运行时隐藏应用程序中的问题,这可能导致非常奇怪的结果并且很难调试它们。

答案 2 :(得分:1)

我经常做

Debug.WriteLine(ex.message)

(这样我就可以在异常中设置一个断点,如果需要的话)

答案 3 :(得分: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项目。

答案 4 :(得分:1)

我同意那些说完全忽略异常可能是一个坏主意的人。如果你不打算重新扔它,那么至少要记录它。我编写了一些处理文件列表的小工具,我不希望单个文件上的错误导致整个程序崩溃,在这种情况下我会打印一条警告消息,以便我可以看到哪些文件被跳过。

我唯一一次在没有命名的情况下捕获异常,就像在catch(xxxException)中一样,如果我要以某种方式对它做出反应然后重新抛出它以便我可以在某些方面捕获它外例。 E.g:

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

    // let _someone_ know the exception happened
    throw;
}

答案 5 :(得分:-1)

即使我是Java开发人员(不是C#),@ Scott Dorman也是绝对正确的。你为什么“吞下这个例外”?更好的是,可以抛出UnauthorizedAccessException?以下是常识性的可能性:

  1. 该文件不存在
  2. 目录不存在
  3. 当前控制线程没有正确的安全权限。在* nix世界中,当前线程可能位于错误的组或错误的用户中。
  4. 磁盘崩溃
  5. 文件的ACL设置为只写但不读。同样,对于目录。
  6. 以上当然是一份不完整的清单。