当XMLin呱呱叫时,如何阻止我的应用程序被终止?

Hai*_*ang 1 perl

在我的应用程序中,我使用XML :: Simple并使用导出的XMLin()来解析XML文件.一切顺利,直到将无效的文件路径用作XMLin()的参数.

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

我希望我的应用程序继续运行,即使XML :: Simple遇到了错误.所以我该怎么做?

小智 6

处理异常.

一般方式:

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 );
}
Run Code Online (Sandbox Code Playgroud)

英语只有这样我可以使用$ EVAL_ERROR而不是$ @.

通常,检查perldoc的eval函数.

  • 英语有许多很长的名字,尽管它们是描述性的.另外,如果你不使用qw(-no_match_vars); 如果你有任何正则表达式,你将在你的程序中引入很大的减速,因为perl将填充$`,$'和$&(以及它们的长名称English.pm对应物). (2认同)
  • 您的eval陷阱代码可能会错过eval失败.你需要像Dave Sherohman那样在他的代码中进行原子检查.请参阅http://www.perlfoundation.org/perl5/index.cgi?exception_handling (2认同)
  • 有关破坏eval错误捕获的代码示例,请参阅Acme :: ExceptionEater(http://search.cpan.org/dist/Acme-ExceptionEater/lib/Acme/ExceptionEater.pm).有关A :: EE的更多详细信息,请参阅http://perlmonks.org/?node_id=637764 (2认同)

Dav*_*man 5

在块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!
Run Code Online (Sandbox Code Playgroud)