首页 > 解决方案 > 我应该在定义函数的模块中还是在 Python 中调用函数的模块中定义 try-except ?

问题描述

假设我有以下 2 个模块:

一个.py:

def connect():
bla bla bla..

b.py:

from a import connect
connect()

connect()我应该为in 模块a还是定义 try-except 子句b

所以

一个.py:

def connect():
    try:
        bla bla bla..
    except:
        bla bla bla..

或者

b.py:

from a import connect

    try:
        connect()
    except:
        bla bla bla..

?

顺便说一句,我“嵌套”会发生什么try-except

一个.py:

def connect():
    try:
        bla bla bla..
    except ValueError:
        bla bla bla..

b.py:

from a import connect

    try:
        connect()
    except Exception, e:
        bla bla bla..

标签: pythontry-catch

解决方案


老实说,这取决于您对 try/except 块的期望。如果connect()运行一些您期望可能会引发 KeyError 的代码,假设因为它假设已填充字典,那么您可能想要捕获它并填充字典:

try:
    my_value = my_dict['my_key']
except KeyError:
    my_dict = populate_my_dict()
    connect()

但是,如果您不希望出现错误connect但又不想b.py在发生任何事情时崩溃,您可能想要执行类似的操作

from a import connect

try:
    connect()
except StandardError as err:
    print("{filename} ran into the following error: {err}".format(filename=__name__, err=err)

永远不要做一个简单的 try/except 块是很重要的,即永远不要except:按原样使用。捕获您期望的特定错误,否则您最终会导致代码崩溃并在后台运行,从而几乎无法调试。

顺便说一句,我“嵌套”了 try-except 会发生什么?

如果connect()不抛出 ValueError,则会崩溃,之后异常会通过管道传递. 由于期待任何(这类似于一个空的 except 块,使用 StandardError 或 UserWarning 代替),异常将被捕获并触发 's except 块的主体。connect()b.pyb.pyExceptionb.py


推荐阅读