2014-12-27 73 views
1

我對prolog中錯誤恢復的機制有點不熟悉,所以如果問題看起來很愚蠢,我很抱歉。 我正在尋找一種在swi-prolog中正確處理SocketError的方法。到目前爲止,我只找到下面的代碼片段:在Prolog中處理SocketError

setup_call_catcher_cleanup(tcp_socket(Socket), 
          tcp_connect(Socket, Host:Port), 
          exception(_), 
          tcp_close_socket(Socket)). 

每當連接被拒絕,它會引發相應的異常並進行清理行動,關閉套接字。

問題是,我想將此嵌入到謂詞test_socket/3中,該謂詞在連接被拒絕時設置狀態碼,我似乎無法找到一種方法。我試着做:

test_socket(Host, Port, Status) :- 
    setup_call_catcher_cleanup(tcp_socket(Socket), 
           tcp_connect(Socket, Host:Port), 
           exception(_), 
           (tcp_close_socket(Socket), Status = 1). 

但這似乎並沒有伎倆。有任何想法嗎?

+1

參數'清理'的目的是執行一些清理操作,然後繼續,就好像這個清理沒有發生。也就是說,例外情況進一步惡化,'Status = 1'是多餘的。構造不是爲了做所有事情。但是,可能最重要的是「catch/3」,就是你想要的。 – false

+0

謝謝!你的建議是我需要的。 – VHarisop

+0

...和:大多數時候使用了'setup_call_cleanup/3',帶有'catcher'的版本是用於調試的。 – false

回答

0

參數Cleanup的用途是執行一些清理操作,然後繼續,就好像清理未發生一樣。也就是說,例外情況進一步惡化,並且是多餘的。構造不是爲了做所有事情。但是,大概這是一個catch/3,是你想要的。 –   false