我应该在定义函数的模块中定义try,还是在Python中调用函数的模块中定义try?

我应该在定义函数的模块中定义try,还是在Python中调用函数的模块中定义try?,python,try-catch,Python,Try Catch,假设我有以下两个模块: a.py: def connect(): bla bla bla.. def connect(): try: bla bla bla.. except: bla bla bla.. from a import connect try: connect() except: bla bla bla.. def connect(): try: bla

假设我有以下两个模块:

a.py:

def connect():
bla bla bla..
def connect():
    try:
        bla bla bla..
    except:
        bla bla bla..
from a import connect

    try:
        connect()
    except:
        bla bla bla..
def connect():
    try:
        bla bla bla..
    except ValueError:
        bla bla bla..
from a import connect

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

from a import connect
connect()
我应该在模块
a
b
中为
connect()
定义try-except子句吗

所以

a.py:

def connect():
bla bla bla..
def connect():
    try:
        bla bla bla..
    except:
        bla bla bla..
from a import connect

    try:
        connect()
    except:
        bla bla bla..
def connect():
    try:
        bla bla bla..
    except ValueError:
        bla bla bla..
from a import connect

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

b.py:

def connect():
bla bla bla..
def connect():
    try:
        bla bla bla..
    except:
        bla bla bla..
from a import connect

    try:
        connect()
    except:
        bla bla bla..
def connect():
    try:
        bla bla bla..
    except ValueError:
        bla bla bla..
from a import connect

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

顺便说一句,如果我尝试“嵌套”
,除了
,会发生什么

a.py:

def connect():
bla bla bla..
def connect():
    try:
        bla bla bla..
    except:
        bla bla bla..
from a import connect

    try:
        connect()
    except:
        bla bla bla..
def connect():
    try:
        bla bla bla..
    except ValueError:
        bla bla bla..
from a import connect

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

def connect():
bla bla bla..
def connect():
    try:
        bla bla bla..
    except:
        bla bla bla..
from a import connect

    try:
        connect()
    except:
        bla bla bla..
def connect():
    try:
        bla bla bla..
    except ValueError:
        bla bla bla..
from a import connect

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

两者似乎都运转良好。我倾向于将try/catch保持在尽可能低的级别(接近原始错误源),以便在可以帮助的情况下保持主代码相对清晰

此外,对于上一个示例,b.py的方法将捕获任何异常。这可能是您想要的,但不是最好的行为,因为它可能会捕捉到您可能希望以更具体的方式处理的奇怪事情

我应该在模块a或b中为connect()定义try-except子句吗

这实际上取决于用例,我的意思是当您可能认为可能存在错误时,始终使用try-catch语句。

我认为在
b.py
中使用
try catch
并不是最佳选择,因为它更简单。基本上,问问自己代码最有可能失败的地方是哪里

我的意思是,在您的特定示例中,它似乎表明
connect
函数中的某些东西可能会失败。因此,我的建议不仅是尝试找出问题的根源,而且,只包装可能失败的内容

因此,让我们假设您的
connect()
作为
dict
查找,您对此很关心。解决这个问题的一个方法是捕获异常。所以,我会这样安排

a.py:

def connect():
    # bla bla bla...
    try:
        foo = some_dict["blah"]
    except KeyError:
        pass
    # bla bla bla...
请注意,此异常处理仅用于示例目的。具体实施取决于您

顺便说一句,如果我没有“嵌套”尝试,会发生什么

您的具体示例将转换为:

如果异常是
ValueError
,则在
a.py
中捕获异常,如果不是,则仍在
b.py
中捕获它作为一般异常

在我看来,这似乎是您试图处理可能发生的任何异常的结果。正如我上面所说的,你应该采取的方法是,只尝试处理可能失败的事情


此代码在其当前状态下将处理可能发生的任何异常。但从逻辑上讲,很可能有很多代码不应该失败。因此,如果一个完全陌生的人阅读了你的代码,他可能会认为在你的
connect
方法中发生了很多奇怪的事情,而实际上你只是在处理你不应该处理的错误

这完全取决于您对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:
。捕获您期望的特定错误,因为否则您将导致代码崩溃并在引擎盖下运行,从而几乎无法进行调试

顺便说一句,如果我没有“嵌套”尝试,会发生什么


如果
connect()
没有抛出值错误,
connect()
将崩溃,之后异常将通过管道传输到
b.py
。由于
b.py
预期出现任何
异常(这类似于裸except块,请改用StandardError或UserWarning),将捕获异常,并触发
b.py
的except块体。

这是我的建议,是的。