代码之家  ›  专栏  ›  技术社区  ›  konichiwa

除了在定义函数的模块或在Python中调用函数的模块之外,我应该定义try吗?

  •  3
  • konichiwa  · 技术社区  · 8 年前

    假设我有以下两个模块:

    A.PY:

    def connect():
    bla bla bla..
    

    B.PY:

    from a import connect
    connect()
    

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

    所以

    A.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 ?

    A.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..
    
    3 回复  |  直到 7 年前
        1
  •  2
  •   scharette    7 年前

    我应该在模块A或B中为connect()定义try except子句吗?

    它将真正取决于用例和我所指的是什么 当您可能认为可能有错误时,总是使用try catch语句。

    我不认为只使用 try-catch 在里面 b.py 只是因为它 简单的 . 基本上,问问自己代码最有可能在哪里失败?

    我的意思是,在你的例子中,它似乎暗示了 connect 函数可能会失败。所以,我的建议不仅是找出问题的根源,而且, 只包装可能失败的东西 .

    所以,假设你 connect() 作为一个 dict 查找,你很担心。好吧,解决这个问题的一种方法是捕获异常。所以,下面是我将如何安排的,

    a.py:
    
    def connect():
        # bla bla bla...
        try:
            foo = some_dict["blah"]
        except KeyError:
            pass
        # bla bla bla...
    

    请注意,此异常处理仅用于示例目的。具体的实现取决于您自己。

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

    您的具体示例将翻译为:

    在中捕获异常 a.py 如果是 ValueError ,如果还没有抓住它 B.Py 作为一般例外。

    对我来说,这似乎是你试图处理任何可能发生的异常的结果。正如我上面所说的,你应该用这种方式来代替,只想处理可能失败的事情。

    此代码在其当前状态下将处理可能发生的任何异常。但从逻辑上讲,很可能有很多代码不应该失败。因此,如果一个完全陌生的人阅读您的代码,他可能会认为在您的 连接 方法当你在实际中处理错误时,你不应该这样做。

        2
  •  3
  •   Guus Suraj    8 年前

    这完全取决于您对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)
    

    重要的是 从未 做一个简单的尝试/排除块,即从不使用 except: 事实也是如此。捕获您所期望的特定错误,因为否则最终会导致代码崩溃并在引擎盖下运行,使其几乎无法调试。

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

    如果 小精灵 抛出一个值错误, 小精灵 将崩溃,在此之后异常将通过管道传递到 B.Py . 自从 B.Py 希望有 Exception (这类似于一个空的except块,请改用standarderror或userwarning),该异常将被捕获,并且

        3
  •  3
  •   Gigaflop    8 年前