如何通过Python套接字处理自定义异常?

2024-04-20 05:28:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用侦听器/客户机模式在两个进程之间通过套接字传输数据。不幸的是,我不知道如何在客户机代码中捕获异常,这发生在侦听器代码中。我想,也许我可以通过简单地通过套接字传输异常来实现这一点,但这是行不通的。你知道吗

这是我的密码:

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语句print 'Received error!'将永远不会执行。你知道吗

处理错误的正确方法是什么?你知道吗


Tags: fromimportsendclose客户机ifmainaddress
1条回答
网友
1楼 · 发布于 2024-04-20 05:28:07

问题是,调用conn.send(e)时,您并没有在侦听器中引发异常,您只是将异常作为普通数据发送(就像您可以发送的任何其他对象一样),而conn.recv()只是将发送的对象提供给您,这一事实并不重要。处理异常的最简单方法是检查它是否是异常的实例(或派生异常的实例):

res = conn.recv()
if(isinstace(res,Exception))
    print 'Received error!'

相关问题 更多 >