3

例如,假设以下 VB.NET 代码片段删除一个目录。

 Try
      Dim SomeFolder="c:\somefolder"
      System.IO.Directory.Delete(SomeFolder, True)    
 Catch ioex As System.IO.IOException     
     'What went wrong? 
     'File locked by another process? 
     'File not found? 
     'something else?
 End Try       

在异常处理程序中,如果目录或其中的文件是打开的,我想让用户有机会关闭文件并重试操作,但前提是 IOException 是由锁定问题引起的。

问题是 IOException 可能由于多种原因引发,例如文件上设置的路径无效或只读标志。这些条件中的每一个都在 . 异常对象的message属性,但是在错误消息中硬编码检查特定字符串以检测失败的具体原因感觉太错误了。我不太相信错误字符串将与 .net 的未来版本一致,并且讨厌不得不大惊小怪地编写本地化代码来处理消息以非英语形式返回的可能性.

必须有一种更好的方法来处理非常常见的异常处理问题。我错过了什么吗?

更新/澄清:感谢到目前为止的答案,但我可能让我的例子有点太笼统了。至少现在,我正在专门寻找一种方法来检测文件被异常处理程序中的另一个进程锁定的情况。

4

2 回答 2

7

您可以捕获一些从IOException继承的异常。

这些包括DirectoryNotFoundException,FileNotFoundException和其他。

为此使用异常处理

Try
  Dim SomeFolder="c:\somefolder"
  System.IO.Directory.Delete(SomeFolder, True)    
Catch fnfex As System.IO.FileNotFoundException     
 'What went wrong? 
 'File not found? 
Catch ioex As System.IO.IOException     
 'What went wrong? 
 'something else?
End Try       

更新

对于文件操作,最好在对其进行操作之前测试文件/文件夹是否存在。这是最佳实践,因为您可以避免不必要的异常:

Dim SomeFolder="c:\somefolder"

If Directory.Exists(SomeFolder) Then
   System.IO.Directory.Delete(SomeFolder, True)
End If

更新 2

在评论和更新有关锁定文件的问题之后。我遇到了同样的问题并且确实求助于解析异常消息,因为没有 FileLockedException 或类似的:(

于 2010-02-09T16:30:10.117 回答
2

更好的选择是预先进行检查,而不是依赖异常。例如:

if (Directory.Exists(SomeFolder))
{
    Directory.Delete(SomeFolder, true);
}

这样,您至少可以尝试减少可能引发 IOException 的许多原因。

编辑:并不是说我的选项消除了对异常处理的需求,只是它使它们成为真正的异常,而不仅仅是正常程序流程的一部分。

更新:所以从评论来看,来自 OP 的例子并不适合我试图提出的想法。我要说明的一点是,最好在可能的异常发生之前检查它们,除非可以。例如:

if (object != null)
{
    object.Value = true;
}

是比巨大的重载更好的选择catch(示例简化):

try
{
    object.Value = true;
}
catch NullRefrenceException
{
    ...
}
catch Exception
{
    ...
}

编辑:关于 OP 关于文件锁的更新。我不相信这里会有更具体的期望,因此解析消息可能是您唯一的选择。除非你能找到某种方法来毫无例外地检查前面的锁定。即使这样,锁定状态也可能在您的检查和尝试访问之间发生变化。

于 2010-02-09T16:30:25.863 回答