Perl 当XMLin发出嘎嘎声时,如何防止我的应用程序被终止?

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并使用导出的XMLin()解析XML文件。在使用无效的文件路径作为XMLin()的参数之前,一切都很顺利

应用程序被终止,因为XML::Simple在指定无效的文件路径时使用了die()或类似的方法


我希望我的应用程序继续运行,即使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在你的评估结束时修复。哦,很好的观点-谢谢你抓住了它!我已经编辑了代码来添加这个。