代码之家  ›  专栏  ›  技术社区  ›  JohnFx

除了解析.message属性之外,是否有可靠的方法来识别由锁定文件引起的IOExceptions?

  •  3
  • JohnFx  · 技术社区  · 16 年前

    例如,假设下面的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可以由于多种原因引发,例如文件上设置的路径或只读标志无效。这些条件中的每一个都在中设置不同的值。 消息 异常对象的属性,但对错误消息中的特定字符串进行硬编码检查以检测失败的特定原因是错误的。我不太相信将来的.NET版本会一致地使用错误字符串,也不愿意为编写本地化代码而大惊小怪,以处理消息以非英语形式返回的可能性。

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

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

    2 回复  |  直到 16 年前
        1
  •  7
  •   Oded    16 年前

    您可以捕获一些继承自的异常 IOException .

    这些包括 DirectoryNotFoundException , FileNotFoundException 以及其他。

    使用 Exception Handling 为此:

    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或类似的方法:(

        2
  •  2
  •   Cory Charlton    16 年前

    更好的选择是提前检查,而不是依赖例外情况。例如:

    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
    {
        ...
    }
    

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