2012-10-21 3 views
3

sbcl 1.0.57.0을 사용 중이며 --eval을 통해 프로그램을 시작하려고합니다. 일부 출력을 생성해야하지만, 잡히지 않은 오류가있는 경우 종료해야합니다. unwind-protect - 어떻게 작동합니까?

내가 그 사용하여이 될 것입니다 달성하기 위해 가장 쉬운 방법을 생각 풀림 방지 : 캐치되지 않는 오류가 넣다 (sb-ext:exit)으로

(unwind-protect (error 'simple-error) 
    (progn (FORMAT t "IAMREACHED~%") (sb-ext:exit))) 

는 executet해야합니다.

하지만 그렇지 않습니다!

* (unwind-protect (error 'simple-error) 

     (progn (FORMAT t "IAMREACHED~%") (sb-ext:exit))) 

    debugger invoked on a SIMPLE-ERROR in thread 
    #<THREAD "main thread" RUNNING {1002979193}>: 
    (A SIMPLE-ERROR was caught when trying to print *DEBUG-CONDITION* when entering 
    the debugger. Printing was aborted and the SIMPLE-ERROR was stored in 
    SB-DEBUG::*NESTED-DEBUG-CONDITION*.) 

    Type HELP for debugger help, or (SB-EXT:QUIT) to exit from SBCL. 

    restarts (invokable by number or by possibly-abbreviated name): 
     0: [ABORT] Exit debugger, returning to top level. 

    (#:EVAL-THUNK) 
    0] 0 
    IAMREACHED 

unwind-protect 작동에 대한 나의 오해는 무엇입니까?

+0

은 CCL에서 작동하지만 SBCL에서 같은 문제를 보여줍니다. – Lex

+0

progn이 필요하지 않습니다. –

+0

캐치 오류가 없습니다. SBCL 디버거가이를 잡았습니다. –

답변

8

UNWIND-PROTECT은 Java 또는 Python에서 finally 절의 유사어이므로 catch-all 절이 아니므로 처리되지 않은 조건을 가로 챌 수 있습니다. 이를 위해서는 CONDITION 유형의 핸들러 절이있는 HANDLER-CASE이 필요합니다.

UNWIND-PROTECT 실제로 귀하의 경우에 사용할 수 있습니다. 유일한 예기치 않은 동작은 전에UNWIND-PROTECT 본문이 실행되기 전에 디버거가 호출된다는 것입니다. 그 이유는 현재 컨텍스트를 잃지 않고 실행을 다시 시작할 수 있기 때문입니다. HANDLER-BIND을 통해 (아마도) 달성됩니다. 자세한 내용은 PCL의 "Conditions and Restarts" 장을 참조하십시오.

2

은 아마 당신은, 디버거를 사용하지 않으려는 자동으로 생략 오류의 목적을 위해 당신은 사용할 수 SBCL Toplevel Options

0

(무시-오류)를 참조하십시오. 또는 디버거를 시작하지 않고 오류 메시지 만 보려면 sb-ext : disable-debugger를 초기에 호출 할 수 있습니다.