有效的Java异常处理—是否在所有情况下都需要它?
我正在通读文件。这个例子就是我要问的: 第一种异常是选中的异常。这些是 书面申请书应具备的特殊条件 预期并从中恢复。例如,假设一个应用程序 提示用户输入文件名,然后通过传递打开文件 java.io.FileReader的构造函数的名称。通常,用户 提供现有可读文件的名称,以便 FileReader对象的执行成功,并且 申请正常进行。但有时用户会提供 不存在文件的名称,构造函数抛出 java.io.FileNotFoundException。一个编写良好的程序会捕捉到这一点 异常并将错误通知用户,可能会提示 已更正的文件名 在PHP中,在接受文件作为有效的用户输入之前,我会检查文件是否存在,例如:有效的Java异常处理—是否在所有情况下都需要它?,java,Java,我正在通读文件。这个例子就是我要问的: 第一种异常是选中的异常。这些是 书面申请书应具备的特殊条件 预期并从中恢复。例如,假设一个应用程序 提示用户输入文件名,然后通过传递打开文件 java.io.FileReader的构造函数的名称。通常,用户 提供现有可读文件的名称,以便 FileReader对象的执行成功,并且 申请正常进行。但有时用户会提供 不存在文件的名称,构造函数抛出 java.io.FileNotFoundException。一个编写良好的程序会捕捉到这一点 异常并将错误通知用户,
if (file_exists($file)) {
//proceed
} else {
//throw error to user
}
通过阅读本文,我是否了解到,在Java中,您只需要“假设”提供的文件是有效的,并使用异常处理程序抛出错误,而不只是检查它是否存在?或者使用异常是检查文件是否存在的一种更干净、更有效的方法吗?我想你是对的-Java最佳实践会推荐这样的代码:
try {
FileInputStream f = new FileInputStream(file);
// proceed
}
catch (IOException e) {
// report error to user
}
尽管存在一些复杂性,例如关闭可能已成功打开或未成功打开的文件。Java7有一种特殊的语法使之更容易(称为
我要注意的是,PHP代码中有一个竞争条件,它可能导致成功的
file\u exists()
调用,但一旦读取该文件,就会丢失一个调用。当然,它可能存在,但不可读。这两种方式都可以;这取决于上下文,但不管它是如何实现的,检查的异常要么被处理,要么被声明为抛出。这可能会改变最有意义的事情
我倾向于在尝试处理文件之前检查文件是否存在。但例外情况只是——(通常)针对特殊情况
例如,我的应用程序检查文件是否存在,它确实存在。从那时起到使用该文件,会出现其他内容并将其删除。现在有一个例外情况,我的代码必须尽可能优雅地处理。关于您的具体示例:异常处理不一定(仅仅)是验证用户输入的一种方法;它是处理
open
或read
操作(隐藏在FileInputStream
中)返回的错误(在PHP中是什么)的替代方法。可以将其视为$err=do\u something($foo)
模型的替代方案。而不是写作
$err = do_something ($foo);
if ($err) {
complain ($foo, $err);
return;
}
do_something_else;
你有(可以说更可读?)
理想情况下,您在
try{}
中的整个操作一次就能看清楚,catch
子句可以在一个地方处理所有的妄想症。检查File.exists()的优点是,这样一个错误才是真正例外的,而不仅仅是用户的打字错误。
try {
foo.doSomething ();
doSomethingElse ();
} catch (SomeException e) {
foo.complain (e);
}