2009-08-26 100 views
1

在我的应用程序中,我使用XML :: Simple并使用导出的XMLin()来解析XML文件。一切都很顺利,直到使用无效的文件路径作为XMLin()的参数。如何防止我的应用程序在XMLin呱呱声时被终止?

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

我想我的应用程序继续运行,即使XML ::简单的遇到了故障。所以我该怎么做?

+0

为什么不在盲目调用XMLin()之前检查文件的存在?我认为这是您的代码负责为解析器提供有效的参数。 – 2009-08-26 11:17:33

+2

@ire_and_curses该文件可能会被删除,或者权限可能会在检查和'XMLin'之间改变。最好将'XMLin'包装在'eval'中。 'eval'是Perl的异常处理机制。 – 2009-08-26 11:20:33

回答

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); 
} 

英语,只有这样我就可以使用$EVAL_ERROR而不是[email protected]

一般来说,检查perldoc for eval function

+1

+1,尽管我讨厌'English.pm',充满激情。 – 2009-08-26 11:21:26

+0

@Sinan - 为什么?我很好奇,没有伤害/拖延打算:) – 2009-08-26 15:20:30

+2

英语有很多很长的名字,尽管它们是描述性的。另外,如果你不使用qw(-no_match_vars); ,如果你有任何正则表达式,你会在你的程序中引入很大的减速,因为perl会填充$',$'和$&(和它们的长名英文.pm对应文件)。 – 2009-08-26 19:28:43

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! 
+1

你的示例很好,除非'do_stuff_that_might_die()'返回一个错误的值,那么你的错误信息是不正确的。您可以在评估结束时添加一个'1;'来解决这个问题。 – daotoad 2009-08-27 03:10:48

+0

哦,好点 - 谢谢你抓到!我编辑了代码来添加这个。 – 2009-08-27 08:28:18

相关问题