Python - 为什么在'except'后需要指定异常类型?
在Python中,当你使用try/except的时候,为什么需要在except后面指定一个异常类型呢?难道不可以直接捕捉所有的异常吗?
try:
#dosomething
except Exception:
#dosomething
为什么在except后面需要写'Exception'呢?
4 个回答
不同的错误需要不同的解决办法。比如,当我在写一个Python的IRC机器人时,我会遇到一种错误是因为不正确地访问了一个字符串,这时候我会在处理这个错误的代码里尝试去修复它。我还有一种错误是关于坏的网络连接,这种情况下我会尝试找出问题出在哪里并进行修复。我不能把这些错误放在一个大类下面处理,因为它们的解决方式是不一样的。
为什么以及如何捕获异常
异常是非常有用的,但处理它们的方法要根据你写的代码类型来不同。
最主要的区别在于,你的代码是顶层代码(处理异常的最后手段)还是内部代码。
另一个方面是,有些异常是可以预料的,有些则是意外的。
对于可以预料的异常(比如你要用的文件丢了),如果代码有机会处理它,就应该处理。
而对于意外的异常,除非在顶层代码中必须处理,否则就不需要去处理。
在顶层代码中处理异常
如果你的代码在某些情况下抛出一个比较难看的错误信息(堆栈跟踪),但这不影响大局,那就可以忽略这些意外的异常。这通常是很高效的,因为代码保持简单,而堆栈跟踪能帮助你找出问题所在。
如果你需要让你的脚本表现得“好一些”——你可以捕获异常,并打印一些看起来不错的错误信息,解释发生了什么问题。
在低层代码(模块、函数)中处理异常
在你的低层代码中,你应该捕获所有可以预料的异常,而其他的则可以忽略,抛给更高层的代码去处理,因为那里更有可能妥善处理这些异常。
如果没有可以预料的异常,就不要使用 try
.. except
语句块。
在低层代码中打印错误信息通常是不合适的(因为高层代码无法控制你的打印输出)。
关于你的问题 - 为什么要用 except Exception
使用明确指定的异常类型的 except
是处理可预料异常的唯一解决方案。如果不提到类型(或类型们),你就会捕获所有异常,这是一种坏习惯,除非你在顶层代码中。
像往常一样,上述建议也有例外,但这些例外发生的频率通常比人们预期的要少。
从语法上来看,这段代码是可以接受的:
try:
# Do something
except:
print "Something went wrong."
但是,很多时候这样做并不是个好主意。因为你捕获了所有的错误,却连错误的名字都不保存,这样你就失去了关于错误发生地点的所有信息。仅仅看到 Something went wrong.
这样的提示是既没用又让人沮丧。所以即使你不想逐个处理每个错误,至少也应该保存一些错误信息。
try:
# Do something.
except Exception, e:
print "Encountered error " + str(e) + " during execution. Exiting gracefully."
上面的代码可能是在你绝对不能让程序突然退出的情况下才会使用的。
编辑:修改了答案以澄清这其实是个坏主意,尽管这样做是可能的。
因为你可能会用不同的方式来处理不同的错误。
比如说,如果你在进行网络操作时,想要连接的网络地址无法找到,这很可能是用户输入错误,这时候你就需要让用户参与进来。而有些其他类型的错误,可能只需要稍等一下再重试就可以了。
在处理错误时,最好只处理你在代码中某个特定位置预期会出现的最小范围的错误,并且只捕捉那些你确定知道怎么处理的错误。一个“万用”的错误处理方式就违反了这个原则。