2013-11-24 32 views
2
使用此代碼這個異常發生時並沒有返回失敗

爲什麼這仍然引發異常,儘管在序言中使用catch?

在Sicstus Polog:

語法錯誤在number_codes/2 !數字語法 !在0線

在SWI-Prolog的

ERROR:number_chars/2:語法錯誤:非法數字

number_codes(Number,"m"), 
catch(number_codes(Number,List),error(syntax_error(_),_), fail). 

如何使它在這個異常返回失敗。

+0

我從來沒有使用'catch',但根據這裏的文檔http://www.swi-prolog.org/pldoc/man?predicate=catch/3它是一個元調用像調用,所以你不需要早先調用number_codes – rano

回答

2

用於捕捉語法錯誤的ISO方法是編寫:

catch(number_codes(Number,"m"),error(syntax_error(_),_), fail). 

第一個參數是要保護的目標,第二個參數是要捕獲的模式。在這種情況下,你想捕獲一個錯誤。錯誤的形式爲error(E,_),其中第一個參數是具體的錯誤術語,在這種情況下爲syntax_error(_)。第二個參數是實現定義的。所以你不能依賴它的精確格式。

從來沒有只是抓住一切(如@CapelliC)建議。以這種方式,您可能會無意中隱藏一些意外錯誤。

+0

我認爲你誤解了我的答案。我清楚地表明,顯示的語法旨在**拋棄**異常。或者你認爲不合法? – CapelliC

+1

@CapelliC:我們同意你寫的內容。但是,正是這種捕獲是一個永久性的錯誤來源:可能不僅有語法錯誤,而且還有其他錯誤。想想一個錯誤的類型列表。 – false

1

這應該是正確的語法爲 '丟棄' 異常

?- catch(number_codes(X,"m"),_,true). 
true. 

?- catch(number_codes(X,"m"),_,false). 
false. 

檢查錯誤的詳細信息,請

?- catch(number_codes(X,"m"),error(E,C),(writeln(E:C),false)). 
syntax_error(illegal_number):context(number_codes/2,_G12951) 
false. 

(我在SWI-Prolog的測試...)

相關問題