Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 一次尝试中的多个功能_Python 3.x - Fatal编程技术网

Python 3.x 一次尝试中的多个功能

Python 3.x 一次尝试中的多个功能,python-3.x,Python 3.x,我试图在try/except中运行多个函数,但不确定这是否正确。对于每个函数返回的每个可能的错误,我是否应该有一个except def connect_to_server(ip, port): try: sock = networking.create_socket() sock.connect((ip, port)) _thread.start_new_thread(recv_data, (sock, )) print("

我试图在try/except中运行多个函数,但不确定这是否正确。对于每个函数返回的每个可能的错误,我是否应该有一个except

def connect_to_server(ip, port):
    try:
        sock = networking.create_socket()
        sock.connect((ip, port))
        _thread.start_new_thread(recv_data, (sock, ))
        print("Connected to on port [" + str(port) + "]")
    except:
        print("Unable to connect to engine.")
        return

    return sock

基本上,它是代码风格、可读性和代码长度之间的折衷

最佳做法是尽可能少地调用
try
子句,但是如果多个函数调用引发相同的异常,您可以将它们组合在一起

然而除了之外的裸
子句几乎从未被视为良好实践(参见示例)

我将重构上述示例以:

def connect_to_server(ip, port):
    try:
        sock = networking.create_socket()
        sock.connect((ip, port))
    except SocketError:  # or whatever exception type you expect
        print("Unable to connect to engine.")
    else:
        _thread.start_new_thread(recv_data, (sock, ))
        print("Connected to on port [" + str(port) + "]")
        return sock
尽管重新引发调用代码的异常以捕获而不是返回隐式的
None
,可能更有意义:

def connect_to_server(ip, port):
    try:
        sock = networking.create_socket()
        sock.connect((ip, port))
    except SocketError:  # or whatever exception type you expect
        print("Unable to connect to engine.")
        raise
    else:
        _thread.start_new_thread(recv_data, (sock, ))
        print("Connected to on port [" + str(port) + "]")
        return sock

您将无法访问
return sock
。除非您提出了异常,否则不要使用blanket
except:
子句。这不是口袋妖怪,你不想捕捉它们的全部,你不想捕捉内存错误、键盘中断或发电机退出信号。第一个异常将被捕获,块的其余部分将不执行。如果这是目标,那么这很好,只需限制你的捕获量。是的。试着把目标定在原子性上,会出现什么例外情况?它所处的例外情况是什么?SocketError?@Doritos是的,
raise
引发与
except
捕获的异常相同的异常