[英]How to handle custom exceptions via Python Sockets?
我正在使用偵聽器/客戶端模式通過兩個進程之間的套接字傳輸數據。 不幸的是,我不知道如何在客戶端代碼中捕獲偵聽器代碼中發生的異常。 我以為也許可以通過簡單地通過套接字傳輸異常來實現此目的,但這是行不通的。
這是我的代碼:
listener.py
:
#!/usr/bin/env python
from multiprocessing.connection import Listener
import random
class MyException(Exception):
pass
def main():
address = ('localhost', 6000) # family is deduced to be 'AF_INET'
listener = Listener(address, authkey='secret password')
rand = random.randint(1, 101)
while True:
conn = listener.accept()
print 'connection accepted from', listener.last_accepted
msg = conn.recv()
# do something with msg
if msg == 'hello':
try:
raise MyException('Oooops')
except MyException as e:
print 'Sending {}'.format(e.message)
conn.send(e)
# conn.send('Hello world! {}'.format(rand))
elif msg == 'close':
conn.close()
break
listener.close()
if __name__ == '__main__':
main()
client.py
:
#!/usr/bin/env python
from multiprocessing.connection import Client
from listener import MyException
def main():
address = ('localhost', 6000)
conn = Client(address, authkey='secret password')
conn.send('hello')
try:
res = conn.recv()
print res
except MyException as e:
print 'Received error!'
conn.send('close')
conn.close()
if __name__ == '__main__':
main()
打印語句print 'Received error!'
在客戶端將永遠不會被執行。
處理錯誤的正確方法是什么?
問題是,當您調用conn.send(e)
時,您沒有在偵聽器中引發異常,而只是將異常發送為普通數據(就像您可以發送的任何其他對象一樣),而conn.recv()
只是給您發送的對象無關緊要。 處理異常的最簡單方法是檢查它是否是異常的實例(或派生的異常的實例):
res = conn.recv()
if(isinstace(res,Exception))
print 'Received error!'
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.