2013-01-25 52 views
0

爲了運行一組簡單的查詢的查詢,我已標記的這些查詢和使用forall/2打電話給他們:gprolog中的錯誤處理?

query_all :- 
    forall(query(Q), (Q -> 
     format('yes: ~w~n',[Q]) ; 
     format('no : ~w~n',[Q]))). 

,所以如果我這樣定義query(true).的東西,我就可以看到yes: true從輸出。

這裏的問題是,query(...)並不總是存在,在序言中找不到任何標記queryforall/2將失敗並導致異常說「錯誤(existence_error(程序,查詢/ 1),FORALL/2)」

我想處理這個異常,但不打破整個控制流程。

我知道catch/3會幫助我,但我不知道如何使用它,我的代碼是:

catch(query_all, error(existence_error(procedure,_),_), recovery). 

recovery :- 
    format('error occurred.~n',[]). 

但序言說:「本機代碼程序捕獲/ 3不能被重新定義。」 有什麼我錯過了?

回答

3

您可以聲明query/1在代碼中加入這一行動態:

:-dynamic(query/1). 

或使用catch/3如你所說,但你不必重新定義它,但用它來代替,例如:

query_all :- 
    catch(
    forall(query(Q), (Q -> 
     format('yes: ~w~n',[Q]) ; 
     format('no : ~w~n',[Q]))), 
     error(existence_error(procedure, _), _), format('error occurred.~n', [])).