2011-08-23 2 views
0

swi-prolog를 사용하고 예외 처리를 사용하려고합니다. 내가 예를 들어, 직접 문자열을 던져 real_pred의 몸에서예외 메시지를받을 수 없습니다.

writeAndFail(message) 
    :- write(message) 
    , fail. 

pred(arg1, arg2) 
    :- catch(
     real_pred(arg1, arg2), 
     Exception, 
     writeAndFail(Exception) 
    ). 

같은 시스템을 가지고 throw('message'). 적절한 테스트 케이스에서 pred를 호출하면 예외가 throw되어 올바르게 캐치되지만 메시지는 쓰여지지 않습니다. 예외 메시지가 인쇄되도록이 코드를 어떻게 변경할 수 있습니까?

답변

1

변수를 원하는 것처럼 보이는 곳에 소문자 용어가 사용됩니다.

조건부 writeAndFail의 원자 message은 항상 리터럴 원자 message입니다. 리터럴 원자 message 이외의 다른 것과 통일되지 않습니다.
일치하는 조건자가 없으므로 writeAndFail(hello)을 호출하는 즉시 실패합니다. arg1, arg2도 마찬가지입니다. pred입니다.

당신은 문자 그대로 인수 pred, arg1arg2를 호출하고 던져 정말 문자 그대로 'message'를 throw하는 경우 다음 그 값을 통합해야하고 예상 결과를 확인해야합니다.

그렇지 않으면 변수를 대문자로 시작하십시오.

+0

catch 조건자를 알고 있습니까 (SWI-Specfic이라고 생각합니까)? 그것은 첫 번째 인자를 에러시에 호출하고 (두 번째 인자는 특정 에러를 잡을 수있다.) 세번째 인자를 호출하므로 아무런 문제가 없지만'writeAndFail'에 맞다. –

+0

죄송합니다. 제대로 읽지 못하셨습니까? –

관련 문제