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,因为用户没有查看它的权限或文件夹不存在……因此,如果您想帮助用户,您可以