【问题标题】:Which is a better solution? (exception handling)哪个是更好的解决方案? (异常处理)
【发布时间】:2019-10-01 08:29:29
【问题描述】:

我应该把异常处理放在哪里?哪一个是代码的最佳解决方案:

def spam(divideBy):
    try:
        return 42 / divideBy
    except ZeroDivisionError:
        print('Error: Invalid argument.')
print(spam(2))
print(spam(12))
print(spam(0))
print(spam(1))

def spam(divideBy):
    return 42 / divideBy

try:
    print(spam(2))
    print(spam(12))
    print(spam(0))
    print(spam(1))

except ZeroDivisionError:
    print('Error: Invalid argument.')

【问题讨论】:

  • 处理任何可以在函数上下文中使用第一种方法完全处理的异常。其余的异常应该使用方法 2 抛出给调用者。取决于上下文。
  • 我更喜欢你的第一个代码,但是按照你的代码风格,我会返回“错误:无效参数”)而不是打印,导致你在 print(spam(1)) 中调用函数
  • 什么意思?我遵循缩进规则

标签: python try-catch except


【解决方案1】:

第一种方法意味着spam() 函数的任何用户在尝试使用结果之前都需要检查它是否返回数字或None(除非他们所做的只是打印结果,如您的示例)。

第二种方法意味着所有用户都必须在调用周围添加try/except

无论哪种方式,调用者都必须做一些事情来处理零除错误。

第二种方法更灵活,因为调用者可以自定义他们处理异常的方式。第一种方法总是打印相同的消息并返回None,调用者对此无能为力。

【讨论】:

  • 但您可能会注意到,在第二种方法中,不会打印最后一个数字。如果我也想打印最后一个数字怎么办?
  • 您可以在每个呼叫周围放置一个单独的try/except,而不是将它们全部包装起来。
猜你喜欢
  • 1970-01-01
  • 2014-03-24
  • 1970-01-01
  • 2014-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-12
  • 1970-01-01
相关资源
最近更新 更多