【发布时间】:2015-10-05 14:36:48
【问题描述】:
这是我的代码:
public void ReadSomeFile(string filePath)
{
if (!File.Exists(filePath))
throw new FileNotFoundException();
var stream = new FileStream(filePath, ....)
.....
}
我是否应该自己抛出异常(参见File.Exists 检查)?如果文件不存在,FileStream 将已经抛出 FileNotFoundException。这里有什么好的编程习惯?代码分析说我们应该验证我们的参数。但是,如果我将该参数直接传递给另一个方法(我的或其他人的代码)并且该方法本身会引发异常,那么在我的代码中验证参数有什么好处?
【问题讨论】:
-
抛出
FileNotFoundException毫无意义——事实上,它只是引发了竞争条件问题。您可以处理异常,让它传播,或者将其包装在您自己的异常中。这分别对应于“我知道如何处理这个”、“我不知道如何处理这个”和“我想在堆栈上处理这个更高的位置”。 -
旁注:如果您真的需要验证参数,您可以检查
filePath是否有效(即绝对路径,或者至少不包含Path.GetInvalidFileNameChars()) -
@AlexeiLevenkov 我认为这也不是必需的。 FileStream 会处理这个,
-
相关:来自Eric Lippert's blog - Vexing exceptions - 此案例属于“exogenous exceptions”。
-
这真的取决于你想要达到的目标。所以对此没有“正确答案”。这取决于