我正在查看python中具有try: except Exception
块的代码。我已经识别出可能引发ValueError
的代码。
我的问题:将ValueError
包括在内是否合理(或者是一种好的做法) except
子句(除Exception
已包含ValueError
)之外?
try:
func_raises_value_error()
func_raises_unknown_error()
except (ValueError, Exception) as e:
pass
答案 0 :(得分:5)
抓住特定错误是绝对好的做法。使用try: except:
有两个一般准则:
try
块;和所以而不是像。
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:
没有意义,原因有两个:
Exception
已合并ValueError
;和e
。如果你可以(或想要)对任何一个函数引发的错误做任何事情,你也可以使用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