Exception 用D打开一个文件

Exception 用D打开一个文件,exception,file-io,d,Exception,File Io,D,如果我想安全地尝试用D打开一个文件,最好的方法是 尝试打开它,捕捉异常(并有选择地找出原因),如果它失败或失败 检查它是否存在,是否可读,然后才打开它 我猜第二种选择会导致更多的IO,并且更复杂,对吗?一般来说,最好先检查文件是否存在,因为文件通常不存在,并且在尝试打开时让它失败是使用异常进行流控制的一种情况。在文件不存在的情况下,它的效率也很低,因为异常在D中非常昂贵(尽管考虑到I/O的昂贵程度,I/O的成本可能仍然超过异常的成本) 在可能引发异常的情况下使用异常通常被认为是不好的做法。在这些

如果我想安全地尝试用D打开一个文件,最好的方法是

  • 尝试打开它,捕捉异常(并有选择地找出原因),如果它失败或失败
  • 检查它是否存在,是否可读,然后才打开它

  • 我猜第二种选择会导致更多的IO,并且更复杂,对吗?

    一般来说,最好先检查文件是否存在,因为文件通常不存在,并且在尝试打开时让它失败是使用异常进行流控制的一种情况。在文件不存在的情况下,它的效率也很低,因为异常在D中非常昂贵(尽管考虑到I/O的昂贵程度,I/O的成本可能仍然超过异常的成本)

    在可能引发异常的情况下使用异常通常被认为是不好的做法。在这些情况下,最好在尝试操作之前返回操作是否成功或检查操作是否可能成功。在打开文件的情况下,您可能会执行后一种操作。所以,做你想做的事情最干净的方法就是

    if(filename.exists)
    {
        auto file = File(filename);
        ...
    }
    
    或者,如果您想一次性将整个文件作为字符串读入,您可以这样做

    if(filename.exists)
    {
        auto fileContents = readText(filename);
        ...
    }
    
    存在
    读取文本
    在std.file中,而
    文件
    在std.stdio中

    如果您要处理的情况是,文件很可能存在,因此引发异常的可能性很小,那么跳过检查并尝试打开文件就可以了。但您希望避免的是依赖于在操作不太可能失败时抛出的异常。您希望很少抛出异常,因此如果操作可能失败并抛出异常,则在尝试操作之前检查操作是否成功。否则,您将使用异常进行流控制,并损害程序的效率(和可维护性)


    通常情况下,当您尝试打开文件时,文件不在那里,因此通常情况下,您应该在尝试打开文件之前检查文件是否存在(但最终取决于您的特定用例)。

    如果根据正常的程序操作和给定的用户输入,文件应该在那里,然后使用1-只需尝试打开文件并依靠异常处理来处理文件不存在的异常情况

    例如:

    /// If the user has a local configuration file in his home directory, open that.
    /// Otherwise, open the global configuration file that is a part of the program,
    /// and should be installed on all systems where the program is running.
    File configFile;
    if ("~/.transmogrifier.conf".expandTilde.exists)
        configFile.open("~/.transmogrifier.conf".expandTilde);
    else
        configFile.open("/etc/transmogrifier.conf");
    

    请注意,使用2可能会导致程序中出现安全问题。例如,如果在程序检查文件是否存在时文件存在,但在尝试打开文件时文件消失,则程序可能会以意外方式运行。如果使用2,请确保即使程序刚刚检查文件是否存在且可读,如果打开文件失败,程序仍能以理想的方式运行。

    我想说的是,您需要为抛出异常做好准备,否则会出现争用条件(另一个过程可能会删除测试和打开等之间的文件)。因此,最好继续打开,然后处理意外事件。

    我看不出尝试打开和检查是否存在有什么区别,对我来说,它们是一样的,尽管一个可能引发异常,另一个可能不会。是否可读将是困难的,并且取决于文件类型d您要验证的数据。在我看来,即使文件存在且可读,您也必须进行数据验证。就我个人而言,我总是执行1。这似乎是我迄今为止看到的最常见的模式。“而另一个没有”-情况并非总是如此,依赖这样的假设可能会导致错误。因此,总而言之,我想这都是关于最有可能(预期)发生的事情读取的结果:如果我们希望文件在那里,请使用1。如果我们不确定,请使用2。是的。使用2时,请确保随时准备处理异常。即使检查文件是否存在成功,也无法保证您可以打开该文件,因为您可能没有读取该文件的权限,或者可能在执行之前被其他进程删除你打开它。所以,你必须随时准备好异常。只是在很多情况下,先检查可以避免抛出异常。顺便问一下:如果没有抛出异常,在try中包含一条语句是否有性能问题?这取决于异常处理的实现,而异常处理又取决于平台和编译器。好的,基于帧的方法(如Windows SEH)提供了非零的设置时间,但释放速度更快。基于表的方法的开销为零,但释放时间更长。一些信息。Linux上的DMD使用哪种方法?不过,我可以自己做一个基准测试。