忽略异常
本文关键字:异常 | 更新日期: 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的是什么?以下是常识性的可能性:
- 文件不存在
- 目录不存在
- 当前的控制线程没有正确的安全权限。在*nix世界中,当前线程可能在错误的组或错误的用户中
- 磁盘崩溃
- 文件的ACL设置为只写而不读。同样,对于目录
当然,以上是一个不完整的列表。