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 未使用。是否有一些标准的接受 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

我通常会

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

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

我个人唯一一次在不命名的情况下捕获异常,例如在 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

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

  1. 文件不存在
  2. 目录不存在
  3. 当前控制线程没有正确的安全权限。在 *nix 世界中,当前线程可能在错误的组或错误的用户中。
  4. 磁盘崩溃了
  5. 文件的 ACL 设置为只写不读。同样,对于目录。

以上当然是一个不完整的列表。

于 2008-10-24T03:56:09.467 回答