Python-在try / catch之前定义变量还是让它们冒泡?

时间:2018-11-14 16:45:33

标签: python exception exception-handling

来自基于Java和C的语言,在Python中看起来很奇怪。 x变量在try块中定义,但在其外部使用。

我知道python不会将try块作为作用域。

try:
    x = 5
except Exception as e:
    print(str(e))

print(f"x = {x}")

这在Python中被认为是一种很好的形式吗?还是最好事先设置x = None?还是第三种选择?为什么?

2 个答案:

答案 0 :(得分:1)

在极少数情况下,try: / except:确实是适当的选择。显然,您给出的示例是抽象的,但是我认为答案是很难的“否”,这不是引用可能未声明的变量的好方法-如果出于某种原因,在{{之前,try:中遇到错误1}},那么当您尝试x = 5时就会出错。

更重要的是,为什么为什么会在try块中分配变量?我想说一个好的经验法则是仅在print(f"x = {x}")中包含您实际测试的异常代码部分

旁注:

  • 我之前曾被告知我使用try是一种不好的形式,因为您真正应该做的是处理某个except Exception错误,或者更好的是{{1} }错误(例如type,这将导致所有其他类型的错误都无法得到处理)... particular可以很容易地引入难以诊断的错误(如果非特定使用)。
  • 我很确定except IndexErrortry / except是等效的。

答案 1 :(得分:0)

在这种情况下,如果在异常之后有一条通用的执行路径,我通常会执行类似的操作(这种操作与if/else有一定的联系有关变量的赋值):

try:
    price = get_min_price(product)
except Exception as ex:
    print("could not get price for product {}: {}".format(product, ex))
    price = 1000000.0
print(f"price = {price}")
if price <= min_price:
    send_price_alert(user, product, price)

但是,我经常以try块中填充任何变量的方式构造代码,而在except块后不再使用:

try:
    price = get_min_price(product)
    print(f"price = {price}")
    if price <= min_price:
        send_price_alert(user, product, price)
except Exception as ex:
    print("could not get price for product {}: {}".format(product, ex))

在这里,price关键字后不使用except,因此不需要初始化。