【问题标题】:Multiple functions in a try except尝试中的多个功能,除了
【发布时间】:2019-09-25 04:11:21
【问题描述】:

我正在尝试在 try/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

【问题讨论】:

  • 你不会联系到return sock
  • 除非您重新提出异常,否则不要使用笼统的 except: 子句。这不是口袋妖怪,您不想全部捕获它们,您不想捕获内存错误或键盘中断或生成器退出信号。 first 异常将被捕获,块的其余部分不被执行。如果这是目标,那很好,只是限制你捕获的内容
  • 是的。尝试以原子性为目标

标签: python-3.x


【解决方案1】:

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

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

然而赤裸裸的except 子句几乎从不被认为是一种好的做法(例如,参见Should I always specify an exception type in `except` statements?)。

我会将上面的示例重构为:

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

【讨论】:

  • raise 会引发什么异常?它所在的例外是什么?套接字错误?
  • @Doritos 是的,raise 引发了与 except 捕获的相同的异常
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-31
  • 2021-01-30
相关资源
最近更新 更多