我正在阅读文档here。我正在质疑这个例子:
第一种异常是已检查的异常。这些是 写得很好的应用程序应该具备的特殊条件 期待并从中恢复。例如,假设一个应用程序 提示用户输入文件名,然后通过传递打开文件 java.io.FileReader的构造函数的名称。通常,用户 提供现有的可读文件的名称,以便构造 的FileReader对象成功,并执行 申请正常进行。但有时用户提供 不存在的文件的名称,以及构造函数抛出 java.io.FileNotFoundException。一个写得很好的程序会抓住这个 异常并通知用户错误,可能提示输入 更正的文件名。
在PHP中,我会检查文件是否存在,然后才接受它作为有效的用户输入,例如:
if (file_exists($file)) {
//proceed
} else {
//throw error to user
}
我从阅读中了解到,在Java中你只需要“假设”提供的文件是有效的,并使用异常处理程序抛出错误而不仅仅是检查它是否存在?或者使用Exception是一种更清晰/有效的方法来检查文件是否存在?
答案 0 :(得分:3)
它可以以任何一种方式完成;更有意义取决于上下文 - 但无论如何实现,必须处理或声明要检查的异常必须被抛出。这可能会改变最有意义的东西。
我倾向于在尝试使用它之前检查文件是否存在。但例外只是 - (通常)用于特殊情况。
例如,我的应用程序检查文件是否存在,确实存在。在此之间和使用该文件之前,会出现其他内容并将其删除。现在有一个特殊情况,我的代码必须尽可能优雅地处理。
答案 1 :(得分:2)
关于您的具体示例:异常处理不一定(只是)一种验证用户输入的方法;它是一个替代方法,可以处理open
或read
操作(隐藏在FileInputStream
中)的错误返回(在PHP中会是什么)。可以将其视为$err = do_something ($foo)
模型的替代方案。而不是写作,
$err = do_something ($foo);
if ($err) {
complain ($foo, $err);
return;
}
do_something_else;
你有(可以说更具可读性)?
try {
foo.doSomething ();
doSomethingElse ();
} catch (SomeException e) {
foo.complain (e);
}
理想情况下,您在try {}
内的整个操作一目了然,catch
条款可以处理一个地方的所有偏执狂。
答案 2 :(得分:0)
我认为你是对的 - Java最佳实践会推荐这样的代码:
try {
FileInputStream f = new FileInputStream(file);
// proceed
}
catch (IOException e) {
// report error to user
}
虽然存在一些复杂性,例如在关闭可能已成功打开或未成功打开的文件时。 Java 7有一个特殊的语法,可以更容易(称为try with resources)。
我注意到PHP代码中存在竞争条件,可能导致file_exists()
调用成功,但一旦读取文件就会丢失调用。当然它可能存在但不可读。