Perl 当XMLin发出嘎嘎声时,如何防止我的应用程序被终止?
在我的应用程序中,我使用XML::Simple并使用导出的XMLin()解析XML文件。在使用无效的文件路径作为XMLin()的参数之前,一切都很顺利 应用程序被终止,因为XML::Simple在指定无效的文件路径时使用了die()或类似的方法Perl 当XMLin发出嘎嘎声时,如何防止我的应用程序被终止?,perl,Perl,在我的应用程序中,我使用XML::Simple并使用导出的XMLin()解析XML文件。在使用无效的文件路径作为XMLin()的参数之前,一切都很顺利 应用程序被终止,因为XML::Simple在指定无效的文件路径时使用了die()或类似的方法 我希望我的应用程序继续运行,即使XML::Simple遇到故障。那么我应该怎么做呢?将呼叫包装在一个块评估中: eval { do_stuff_that_might_die(); 1; } or do { # Only executes if
我希望我的应用程序继续运行,即使XML::Simple遇到故障。那么我应该怎么做呢?将呼叫包装在一个块评估中:
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!
eval{
做你可能会死的事;
1.
}或者{
#仅在调用终止时执行,以防需要
#进行任何清理或错误处理
打印“它死了,但生命还在继续!\n”;
}; # 将呼叫包装在块评估中:
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!
eval{
做你可能会死的事;
1.
}或者{
#仅在调用终止时执行,以防需要
#进行任何清理或错误处理
打印“它死了,但生命还在继续!\n”;
}; # 处理异常。
一般方法:
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 );
}
那里的英语只有这样我才能用而不是
通常,检查。处理异常。
一般方法:
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 );
}
那里的英语只有这样我才能用而不是
通常,检查。为什么不在盲目调用XMLin()之前检查文件是否存在?我认为您的代码有责任向解析器提供有效的参数。@ire_和_诅咒文件可能会被删除,或者权限可能会在检查和XMLin
之间更改。最好将XMLin
包装在eval
中eval
是Perl的异常处理机制。为什么不在盲目调用XMLin()之前检查文件是否存在?我认为您的代码有责任向解析器提供有效的参数。@ire_和_诅咒文件可能会被删除,或者权限可能会在检查和XMLin
之间更改。最好将XMLin
包装在eval
中eval
是Perl的异常处理机制。@Sinan-为什么?我很好奇,没有恶意:)英语有很多很长的名字,尽管它们是描述性的。此外,如果不使用qw(-no_match_vars),如果你有任何正则表达式,你会在你的程序中引入极大的减速,因为perl将填充$`、$和$&(以及它们的长名称English.pm对应项)。@Robert-不确定你写的是“不喜欢英语”还是“喜欢英语”。描述性名称非常好,每次使用英语时都会提到regexps的问题。您的eval捕获代码可能会错过eval失败。你需要像Dave Sherohman在他的代码中那样进行原子检查。请参阅Acme::ExceptionEater()以获取打破eval错误捕获的代码示例。有关A::EE的更多详细信息,请参见@Sinan-为什么?我很好奇,没有恶意:)英语有很多很长的名字,尽管它们是描述性的。此外,如果不使用qw(-no_match_vars),如果你有任何正则表达式,你会在你的程序中引入极大的减速,因为perl将填充$`、$和$&(以及它们的长名称English.pm对应项)。@Robert-不确定你写的是“不喜欢英语”还是“喜欢英语”。描述性名称非常好,每次使用英语时都会提到regexps的问题。您的eval捕获代码可能会错过eval失败。你需要像Dave Sherohman在他的代码中那样进行原子检查。请参阅Acme::ExceptionEater()以获取打破eval错误捕获的代码示例。有关A::EE的更多详细信息,请参见您的示例“很好”,但如果do\u stuff\u that\u may\u die()
返回错误值,则错误消息不正确。您可以添加一个1代码>在你的评估结束时修复。哦,很好的观点-谢谢你抓住了它!我编辑了代码以添加此内容。您的示例很好,但如果do\u stuff\u that\u may\u die()
返回一个假值,则您的错误消息不正确。您可以添加一个1代码>在你的评估结束时修复。哦,很好的观点-谢谢你抓住了它!我已经编辑了代码来添加这个。