在我的應用程序中,我使用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