2009-08-26 4 views
1

내 응용 프로그램에서는 XML :: Simple을 사용하고 내 보낸 XMLin()을 사용하여 XML 파일을 구문 분석합니다. 유효하지 않은 파일 경로가 XMLin()의 매개 변수로 사용될 때까지 모든 것이 잘됩니다.XMLin이 울리면 내 응용 프로그램이 종료되지 않도록하려면 어떻게합니까?

잘못된 파일 경로가 주어 졌을 때 XML :: Simple이 die() 또는 유사한 메서드를 사용했기 때문에 응용 프로그램이 종료되었습니다.

XML :: Simple에서 오류가 발생해도 응용 프로그램을 계속 실행하고 싶습니다. 그래서 내가 무엇을해야하니?

+0

맹목적으로 XMLin()을 호출하기 전에 파일의 존재 여부 만 확인하는 것은 어떻습니까? 파서에 유효한 인수를 제공하는 것이 코드의 책임이라고 생각합니다. –

+2

@ire_and_curses 파일이 삭제되었거나 검사와 'XMLin'사이에서 권한이 변경 될 수 있습니다. 'eval'에'XMLin'을 싸는 것이 가장 좋습니다. 'eval'은 Perl의 예외 처리 메커니즘입니다. –

답변

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

열정으로 '영어 .pm'을 싫어하더라도 +1. –

+0

@Sinan - 왜? 나는 호기심이다, 해로울 의도는 없다. :) –

+2

영어는 많은 긴 이름을 가지고 있지만 설명이 풍부하다. 또한, qw (-no_match_vars)를 사용하지 않으면; perl이 $', $ '및 $ & (및 그들의 긴 이름 인 영어 .pm 대응 물)을 채울 것이기 때문에 정규식이 있으면 프로그램에서 큰 속도 저하를 초래할 것입니다. –

5

랩 블록 평가에서 호출 :

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

+0

오, 좋은 지적 - 그것을 붙잡아 주셔서 감사합니다! 이 코드를 추가하여 코드를 추가했습니다. –

관련 문제