簡體   English   中英

如何通過Python套接字處理自定義異常?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM