Python学习笔记:异常

Python 用异常对象来表示异常情况。如果异常对象并未被处理或捕获,程序就会用所谓的回溯(Traceback,一种错误信息)终止执行。实际上每个异常都是一些类的实例,这些类可以被引发,并且可以用很多方法进行捕获,使得程序可以进一步对错误进行处理。


使用raise语句引发异常:

为了引发异常,可以使用一个类(Exception的子类)或者实例参数调用raise语句,程序会自动创建实例。以下语句可以列出所有内建的异常类:

>>>import exceptions
>>>dir(exceptions)


自定义异常类:

可以根据异常所在的类,选择性地处理当前类型的异常,需要一个独立于exceptions模块的异常类。

创建自己的异常类就像其他类一样——只需确保从Exception类继承(间接或直接皆可),大致类似以下语句:

class SomeCustomException(Exception): pass

可以通过使用 try / except 语句来捕获异常。例如:

try:
	x=input('Enter the first number: ')
	y=input('Enter the second number: ')
	print x/y
except ZeroDivisionError:
	print "The second number can't be zero!"

若没有进行捕获,异常将“传播”到调用的函数中,并且“浮”到程序的最顶层。

如果在某个地方捕获到了一个异常,可以继续用无参数的raise语句抛出,即在当前仍然不予以处理。


可以直接在同一个 try / except 语句后面加上另一个except 子句:

try:
	x=input('Enter the first number: ')
	y=input('Enter the second number: ')
	print x/y
except ZeroDivisionError:
	print "The second number can't be zero!"
except TypeError:
	print "That wasn't a numebr!"

类似的,也可以用一个块来捕捉两个异常,将它们作为元组在 except 语句后面列出,注意括号一定不能少:

try:
	x=input('Enter the first number: ')
	y=input('Enter the second number: ')
	print x/y
except (ZeroDivisionError, TypeError, NameError):
	print 'Your numebrs were bogus!'


如果希望在except子句中访问异常对象本身,可以使用两个参数(捕获多个异常的上面例子中其实只传入了一个参数——元组)。下面的示例程序会打印异常,但是程序会继续运行:

try:
	x=input('Enter the first number: ')
	y=input('Enter the second number: ')
	print x/y
except (ZeroDivisionError, TypeError, NameError), e:
	print e


全能捕获:如果想用一段代码捕捉所有异常,可以在except子句中忽略所有的异常类:

try:
	x=input('Enter the first number: ')
	y=input('Enter the second number: ')
	print x/y
except:
	print 'Something wrong happened!'


一个很有用的特性:在 try / except 语句后再附上 else 语句块,则若发生了异常则不执行else子句,而异常没有发生的时候则执行else中的子句,如例子:

while True:
	try:
		x=input('Enter the first number: ')
		y=input('Enter the second number: ')
		value=x/y
		print 'x/y is ', value
	except:
		print 'Invalid input. Please try again.'
	else:
		break
		

这里的循环只有在没有异常发生的情况下才会退出,只要有错误发生,就会不断要求重新输入。


最后还可以接 finally 子句。它可以用来在可能的异常后进行清理。finally 子句不管 try 子句中是否发生异常都一定会被执行,作用域功能与 java 异常中的 finally 语句类似,但是一个重要的不同是:在Python中的 try 语句中不能同时使用 except 和 finally 子句——但是可以一个子句放置在另一个子句中。


异常与函数可以一起使用,如果异常在函数内引发而不被处理,它就会传播至函数调用的地方,如果在那里也没有被处理,则一直到达主程序(全局作用域),如果仍没有被处理,则引发程序崩溃,打印出堆栈跟踪信息。


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值