Python包含异常

时间:2015-04-13 15:51:25

标签: python exception exception-handling

我正在查看python中具有try: except Exception块的代码。我已经识别出可能引发ValueError的代码。

我的问题:将ValueError包括在内是否合理(或者是一种好的做法) except子句(除Exception已包含ValueError)之外?

try:
    func_raises_value_error()
    func_raises_unknown_error()
except (ValueError, Exception) as e:
  pass

2 个答案:

答案 0 :(得分:5)

抓住特定错误是绝对好的做法。使用try: except:有两个一般准则:

  1. 尽可能缩短try块;和
  2. 尽可能具体说明您要处理哪些错误。
  3. 所以而不是像。

    try:
        print("Please enter your name")
        name = input(" > ")
        print("Please enter your age")
        age = int(input(" > "))
        print("{} is {} years old".format(name, age))
    except Exception:
        print("Something went wrong")
    

    你应该:

    print("Please enter your name")
    name = input(" > ")
    print("Please enter your age")
    
    try:
        age = int(input(" > "))
    except ValueError:
        print("That's not a number")
    else:
        print("{} is {} years old".format(name, age))
    

    请注意,这允许更具体的错误消息,并允许任何未预期的错误传递给调用者(每the Zen of Python“错误永远不应该以默认方式传递。除非明确指出沉默“。


    在您的具体情况下,使用except (ValueError, Exception) as e:没有意义,原因有两个:

    1. Exception已合并ValueError;和
    2. 您实际上并没有使用e
    3. 如果你可以(或想要)对任何一个函数引发的错误做任何事情,你也可以使用except Exception:(至少比except:更好)

答案 1 :(得分:1)

处理代码块中可能发生的多个异常时的一个好习惯是将它们从最具体的一个处理到最一般的一个。 例如,您的代码可以写成:

try:
    func_raises_value_error()
    func_raises_unknown_error()
except ValueError as e:
  print 'Invalid value specified: %s' % e
except Exception as e:
  print 'A totally unexpected exception occurred: %s' % e