2009-08-26 42 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

相關問題