在我的应用程序中,我使用XML :: Simple并使用导出的XMLin()来解析XML文件。一切都很顺利,直到使用无效的文件路径作为XMLin()的参数。如何防止我的应用程序在XMLin呱呱声时被终止?
由于XML :: Simple在使用die()或类似的方法给出无效文件路径时终止了应用程序。
我想我的应用程序继续运行,即使XML ::简单的遇到了故障。所以我该怎么做?
在我的应用程序中,我使用XML :: Simple并使用导出的XMLin()来解析XML文件。一切都很顺利,直到使用无效的文件路径作为XMLin()的参数。如何防止我的应用程序在XMLin呱呱声时被终止?
由于XML :: Simple在使用die()或类似的方法给出无效文件路径时终止了应用程序。
我想我的应用程序继续运行,即使XML ::简单的遇到了故障。所以我该怎么做?
处理异常。
一般方法:
use English qw(-no_match_vars);
eval {
run_your_code_that_might_die();
};
if (my $error = $EVAL_ERROR) {
die $error unless $error =~ m{some|known|error};
handle_known_error($error);
}
英语,只有这样我就可以使用$EVAL_ERROR而不是[email protected]。
一般来说,检查perldoc for eval function。
+1,尽管我讨厌'English.pm',充满激情。 – 2009-08-26 11:21:26
@Sinan - 为什么?我很好奇,没有伤害/拖延打算:) – 2009-08-26 15:20:30
英语有很多很长的名字,尽管它们是描述性的。另外,如果你不使用qw(-no_match_vars); ,如果你有任何正则表达式,你会在你的程序中引入很大的减速,因为perl会填充$',$'和$&(和它们的长名英文.pm对应文件)。 – 2009-08-26 19:28:43
裹在一个块EVAL电话:
eval {
do_stuff_that_might_die();
1;
} or do {
# Only executes if the call died, in case you want
# to do any cleanup or error handling
print "It died, but life goes on!\n";
}; # <-- Don't forget the semicolon!
你的示例很好,除非'do_stuff_that_might_die()'返回一个错误的值,那么你的错误信息是不正确的。您可以在评估结束时添加一个'1;'来解决这个问题。 – daotoad 2009-08-27 03:10:48
哦,好点 - 谢谢你抓到!我编辑了代码来添加这个。 – 2009-08-27 08:28:18
为什么不在盲目调用XMLin()之前检查文件的存在?我认为这是您的代码负责为解析器提供有效的参数。 – 2009-08-26 11:17:33
@ire_and_curses该文件可能会被删除,或者权限可能会在检查和'XMLin'之间改变。最好将'XMLin'包装在'eval'中。 'eval'是Perl的异常处理机制。 – 2009-08-26 11:20:33