忽略异常

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应该用来消除这个警告?
6个回答

12

只需将其重写为

catch (UnauthorizedAccessException) {}

1
但是请仍然包括注释!在生产代码中完全空的块不应该通过代码审查,在我看来。 - Jon Skeet
但请仍然包括注释...我不同意这一点。 "catch(SomeException) {}"已经清楚地表明了"忽略SomeException",在许多情况下,附加注释将是多余的。 - Joe

2

正如Dave M.和tvanfosson所说,您需要将其重写为

catch (UnauthorizedAccessException) {}

然而,更重要的问题是为什么要捕获异常并忽略它(通常称为吞掉异常)?这通常是一个坏主意,因为它可能会在运行时隐藏应用程序中的问题,导致非常奇怪的结果和难以调试的困境。


至少这比“catch(Exception) {}”好。 - MusiGenesis
真的,但只是稍微好一点。 - Scott Dorman
我认为有时捕获并忽略异常是可以的,但必须始终有一条注释解释为什么这样做。 - Jon Skeet
捕获特定的异常是完全没问题的。 - Joe
同意。特别是因为检查目录访问权限的代码并不简单。 - Robert Rossney
在这种特定情况下,吞掉异常是可以的,但正如Jon所提到的,应该在某个地方(注释中)记录下它被故意忽略了。我不希望这看起来像随时都可以这样做。 - Scott Dorman

1

我同意那些认为简单忽略异常可能是个坏主意的人。如果你不想重新抛出它,那么至少在某个地方记录一下。我写过一些处理文件列表的小工具,在这种情况下,我不希望单个文件的错误导致整个程序崩溃,因此我会打印一个警告消息,以便我可以看到哪些文件被跳过了。

我个人唯一会捕获未命名异常(如catch(xxxException))的情况是,如果我要对其做出反应,然后重新抛出它,以便我可以在某个外部例程中捕获它。例如:

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

    // let _someone_ know the exception happened
    throw;
}

1

我通常会这样做

Debug.WriteLine(ex.message)

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

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 项很容易 - 几乎肯定你不想在那里处理任何异常。 - Joe
你可能是对的。但我不会假定知道原发布者的代码意图,在代码评审中,我会要求他告诉我。 - Robert Rossney

-1

尽管我是Java开发人员(不是C#),@Scott Dorman是绝对正确的。为什么你要“吞噬异常”?更好的方法是,可能会抛出UnauthorizedAccessException异常?以下是常见的可能性:

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

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


这些常识性的可能性中有三个不会引发UnauthorizedAccessException异常。而另外两个正是该方法吞噬异常的原因:它只想访问其被授权访问的文件。 - Robert Rossney

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接