处理异常
- 异常有不同的类型,其类型会作为消息的一部分打印出来,内置的异常 列出了内置的异常以及它们的含义。
while True:
try:
x = int(raw_input("Please enter a number: "))
break
except ValueError:
print "Oops! That was no valid number. Try again..."
except (RuntimeError, TypeError, NameError):
pass
except IOError as e:
print "I/O error({0}): {1}".format(e.errno, e.strerror)
else :
pass
try语句可能有多个异常子句,用来指定多个不同的异常。不过至多只有一个处理程序将被执行。- 如果异常的类型与 except 关键字后面的异常名不匹配,它将被传递给上层的
try语句。 - 一个 except 子句可以用带括号的元组列出多个异常的名字。括号是必须的。
else子句必须放在except后面,当try没有抛出异常时将执行该语句,当try执行return时else子句将不会被执行。- 使用
else子句比把额外的代码放在try子句中要好,因为它可以避免意外捕获不是由try ... except语句保护的代码所引发的异常。 except子句可以在异常名(或元组)之后指定一个变量。这个变量将绑定于一个异常实例,同时异常的参数将存放在实例的args中。
try:
raise Exception('spam', 'eggs')
except Exception as inst:
print type(inst) # the exception instance
print inst.args # output : spam eggs
print inst # __str__ allows args to be printed directly
引发异常
raise语句允许程序员强行引发一个指定的异常。
try:
raise NameError('HiThere')
except NameError:
print 'An exception flew by!'
raise
自定义异常
class MyError(Exception):
def __init__(self, value):
self.value = value
def __str__(self):
return repr(self.value)
try:
raise MyError(2*2)
except MyError as e:
print 'My exception occurred, value:', e.value
- 用户可以通过创建新的异常类来命名自己的异常。异常通常应该继承Exception类,直接继承或者间接继承都可以。
- 创建一个能够引发几种不同错误的模块时,一个通常的做法是为该模块定义的异常创建一个基类,然后基于这个基类为不同的错误情况创建特定的子类。
finally
try语句有另一个可选的子句,目的在于定义必须在所有情况下执行的清理操作。- 不管有没有发生异常,在离开try语句之前总是会执行
finally子句。 - 另外,假如
try、else、except、finally语句都包含return时,函数的返回值为最后执行的return语句,也就是finally中的return语句,因为它总是最后执行。
try:
raise KeyboardInterrupt
finally:
print 'Goodbye, world!'
本文详细介绍了Python中的异常处理机制,包括不同类型的异常、如何通过try-except语句捕捉和处理异常、自定义异常的创建方法以及finally子句的作用。
623

被折叠的 条评论
为什么被折叠?



