我的方法是否应该抛出它自己的异常,或者如果文件不存在,让.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
。什么是好的编程实践呢?代码分析表明,我们应该验证参数。但是,如果我将该参数直接传递给另一个方法(我的或其他人的代码),而该方法将抛出异常本身,那么在我的代码中验证参数的优势是什么?
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
块中返回实际内容。
这将留下三种可能的情况:
- 返回文件的内容;
- 返回默认值,因为发生了预期错误;
- . net抛出一个错误,因为你没有捕捉到特定的错误。
让正确的方法尝试打开文件,而您对full没有任何概念文件名,像特殊的文件名(例如。设备文件和UNC路径):
在某些情况下,其他文件方法可能失败,但打开文件是成功的。
特殊文件名的例子有:
- 的
- NUL
- com1, com2, com3, com4
- ' ' server ' ' file_path分享
- ''teela'admin$'system32(到达C:'WINNT'system32)
- C: . . ' File.txt
- ' ' ' COM1。
- %临时%
- 和更多…