Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我的方法是否应该抛出自己的异常,或者如果文件没有';不存在?_C#_Exception - Fatal编程技术网

C# 我的方法是否应该抛出自己的异常,或者如果文件没有';不存在?

C# 我的方法是否应该抛出自己的异常,或者如果文件没有';不存在?,c#,exception,C#,Exception,这是我的密码: public void ReadSomeFile(string filePath) { if (!File.Exists(filePath)) throw new FileNotFoundException(); var stream = new FileStream(filePath, ....) ..... } 我是否应该自己抛出异常(请参见文件.Exists检查)FileStream将已经抛出FileNotFoundExcepti

这是我的密码:

public void ReadSomeFile(string filePath)
{
    if (!File.Exists(filePath))
        throw new FileNotFoundException();

    var stream = new FileStream(filePath, ....)
    .....
}
我是否应该自己抛出异常(请参见
文件.Exists
检查)<如果文件不存在,code>FileStream将已经抛出
FileNotFoundException
。这里的好编程实践是什么?代码分析说我们应该验证我们的参数。但是,如果我将该参数直接传递给另一个方法(我的或其他人的代码),并且该方法将抛出异常本身,那么验证代码中的参数有什么好处呢?

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

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

由于您不想重复自己的操作,而是希望代码保持干燥,因此只需尝试打开文件,然后让
newfilestream()
抛出。然后可以捕获异常,如果愿意,可以重新抛出原始异常或抛出特定于应用程序的异常


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

您的方法被称为
ReadSomeFile
,并将
文件名作为其输入,因此抛出
FileNotFoundException
是合理的。由于无法通过捕获异常然后自己抛出它来添加任何值,所以就让.NET抛出它吧


但是,如果您的方法是
LoadData(databaseName)
,并且它必须访问许多文件,那么捕获异常并引发自定义异常可能很有价值,因为您可以将
databaseName
以及其他有用信息添加到异常中。

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

如果要读取日志文件,但该文件不存在,是要抛出错误,还是只抛出空字符串(或空字符串数组)

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

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

  • 返回文件的内容
  • 返回默认值,因为发生了预期错误
  • NET引发了一个错误,因为您没有捕获该特定错误

  • 让正确的方法尝试打开文件,而您不知道完整的 文件名,如特殊文件名(如和):

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

    特殊文件名的一些示例如下:

    • 骗局
    • 努尔
    • COM1,COM2,COM3,COM4
    • \\服务器\共享\文件\路径
    • \\teela\admin$\system32(到达C:\WINNT\system32)
    • C:..\File.txt
    • \\商务英语1
    • %温度%
    • 还有更多

    抛出一个
    FileNotFoundException
    是没有意义的——事实上,这只会引发竞争条件问题。要么处理异常,让它传播,要么将其包装到自己的异常中。这分别对应于“我知道如何处理这个”、“我不知道如何处理这个”和“我想在堆栈上更高的位置处理这个”。旁注:如果确实需要验证参数,可以检查
    filePath
    看起来是否有效(即绝对路径,或者至少不包含
    path.GetInvalidFileNameChars()
    )@阿列克谢列文科夫我认为这也不是必需的。FileStream将处理这个问题,相关的:From-这个案例属于“外部异常”。这实际上取决于您想要实现什么。因此没有“正确答案”。信息技术depends@CodeCaster当然其他一些进程可以在
    file.Open(f)之间创建文件投掷,然后你接住它。问题不在于在处理之前情况可能会发生变化(因为在失败的情况下这几乎是不可避免的),而在于您应该进行一次错误检查以避免重复(无论如何,您必须在打开时进行错误检查)。(还请注意,当与某些文件系统交谈时,成功打开并不意味着文件不会在您身上删除:因此,即使在打开后失败也可能发生。)除了竞争条件外,此代码忽略文件存在但不可读的情况(由于权限等原因),当检查一个文件的存在并立即尝试打开它时,它通常是一个反模式,如果其他逻辑分隔开和打开,那么我不认为它是反模式。在某些网络系统上,检查文件的表面可用性可能比获取打开文件所需的锁要便宜。如果除非有多个文件可用,否则代码将无法执行任何有用的操作,那么在获取打开任何文件所需的锁之前,确保所有文件似乎都可用可能会很有用。Python有一个名为“请求原谅比请求许可更容易”(EAFP)的策略。这意味着,有时,由于比赛条件和你无法控制的事情,最好只是让你的程序做它想做的事情,并处理所有可能的错误(异常),而不是在每一步检查条件是否最佳。在本例中,我认为EAFP可以应用于最佳实践。此外,可能会发生FileNotFoundException,因为用户没有查看它的权限或文件夹不存在……因此,如果您想帮助用户,您可以