忽略异常

本文关键字:异常 | 更新日期: 2023-09-27 17:48:53

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

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;
}

尽管我是Java开发人员(而不是C#),但@Scott Dorman是绝对正确的。你为什么"忍气吞声"?更好的是,可以抛出UnauthorizedAccessException的是什么?以下是常识性的可能性:

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

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