我的方法是否应该抛出它自己的异常,或者如果文件不存在,让.net抛出异常

本文关键字:如果 或者 文件 不存在 抛出异常 net 异常 自己的 是否 方法 它自己 | 更新日期: 2023-09-27 18:16:00

下面是我的代码:

public void ReadSomeFile(string filePath)
{
    if (!File.Exists(filePath))
        throw new FileNotFoundException();
    var stream = new FileStream(filePath, ....)
    .....
}

我应该自己抛出一个异常(参见File.Exists检查)吗?如果文件不存在,FileStream将会抛出FileNotFoundException。什么是好的编程实践呢?代码分析表明,我们应该验证参数。但是,如果我将该参数直接传递给另一个方法(我的或其他人的代码),而该方法将抛出异常本身,那么在我的代码中验证参数的优势是什么?

我的方法是否应该抛出它自己的异常,或者如果文件不存在,让.net抛出异常

if (File.Exists(f)) { DoSomething(f) }(或其否定)是一个反模式。文件可以在这两个语句之间被删除或创建,所以像这样检查它的存在是没有意义的。

除此之外,正如在注释中指出的那样,虽然File.Exists()可能返回true,但由于各种原因,实际打开文件仍然可能失败。因此,您必须重复错误检查,并在打开文件时抛出错误。

因为你不想重复你自己,而是保持你的代码DRY,只是尝试打开文件,让new FileStream()抛出。然后你可以捕获异常,如果你愿意,可以重新抛出原始异常或抛出特定于应用程序的异常。

当然,调用File.Exists()是可以合理的,但不是在这种模式下。

您的方法称为ReadSomeFile,并将filename作为其输入,因此它抛出FileNotFoundException是合理的。因为你不能通过捕获异常然后自己抛出它来增加任何值,所以就让。net抛出它吧。

然而,如果你的方法是LoadData(databaseName),它必须访问许多文件,捕捉异常,并抛出一个自定义异常可能是有价值的,因为你可以将databaseName与其他有用的信息一起添加到异常中。

除了已经给出的答案,你还可以说这取决于你预期会发生什么。

如果你想读取一个日志文件,但它不存在,你是想抛出一个错误,还是只是一个空字符串(或空字符串数组)?

如果返回默认值(如空字符串),我将简单地将函数的内容包装在try-catch中(但仅针对预期的错误),并在catch块中返回默认值,同时在try块中返回实际内容。

这将留下三种可能的情况:

  1. 返回文件的内容;
  2. 返回默认值,因为发生了预期错误;
  3. . net抛出一个错误,因为你没有捕捉到特定的错误。

让正确的方法尝试打开文件,而您对full没有任何概念文件名,像特殊的文件名(例如。设备文件和UNC路径):

在某些情况下,其他文件方法可能失败,但打开文件是成功的。

特殊文件名的例子有:

  • NUL
  • com1, com2, com3, com4
  • ' ' server ' ' file_path分享
  • ''teela'admin$'system32(到达C:'WINNT'system32)
  • C: . . ' File.txt
  • ' ' ' COM1。
  • %临时%
  • 和更多…
相关文章: