在方法定义或调用方法中使用try exception / catch?

时间:2017-12-12 12:39:12

标签: python oop exception try-catch

以下哪个代码段是常见的?

#1:

def foo():
    try:
        pass  # Some process
    except Exception as e:
        print(e)

foo()

#2:

def foo():
    pass  # Some process

try:
    foo()
except Exception as e:
    print(e)

2 个答案:

答案 0 :(得分:5)

这取决于foo的作用以及Exception的类型,我会说。

调用者应该处理它还是方法?

例如,请考虑以下示例:

def try_get_value(registry, key):
    try:
        return registry[key]
    except KeyError:
        return None

此函数将尝试使用其键从字典中获取值。如果该值不存在,则应返回None

该方法应该处理KeyError,因为当发生这种情况时它需要返回None,以便符合其预期的行为。 (它是解决此错误的方法的责任

但请考虑其他异常类型,例如TypeError,例如,如果注册表不是dict )。

我们的方法为什么要处理?这是打电话搞砸了。他应该处理这个问题,他应该为此担心。

此外,如果我们得到Exception,我们的方法可以做什么?我们无法在这个范围内处理这个问题。

try_get_value有一个简单的任务:从注册表中获取值(如果没有,则为默认值)。它不对打电话者违反规则负责。

所以我们不会抓住TypeError因为它不是我们的责任

因此,来电者的代码可能如下所示:

try:
    value = try_get_value(reg, 'some_key')
    # Handle value
except TypeError:
    # reg is not a dict, do something about it...

PS :如果出现意外退出,我们的foo方法可能需要进行一些清理(例如已分配)一些资源如果没有关闭会泄漏)。

在这种情况下,foo应该捕获异常,只是因为它可以正确地修复其状态,但应该raise它们再次返回给调用者。

答案 1 :(得分:2)

我认为第一部分更干净,更优雅。也更合乎逻辑,因为作为函数的实现者,您希望处理它可能抛出的所有异常,而不是将其留给客户端或调用者。即使您是唯一使用该方法的人,您仍然希望处理函数内部的异常,因为将来您可能不记得它抛出的异常。

相关问题