Python学习笔记(十七):异常-----最后一篇

以Mark Lutz著的《Python学习手册》为教程,每天花1个小时左右时间学习,争取两周完成。 --- 写在前面的话


2013-7-26 19:00 学习笔记

1,Python中的异常起着错误处理、事件通知、特殊情况处理、终止行为、非常规流程控制等作用。用法如下:

x = [1,2,3]
try:
	print x[3]
except IndexError:
	print 'IndexError'
print 'end...'
运行结果如下:

IndexError
end...
try语句中也可以包括finally代码块,finally中的代码无论是否发生异常都会执行。例如:

x = [1,2,3]
try:
	print x[3]
except IndexError:
	print 'IndexError'
finally:
	print 'finally...'
print 'end...'
运行结果为:

IndexError
finally...
end...

2,try语句中可以有多个except,同时可以有else,当没有异常时会执行else中的语句。从Python2.5开始,except、else、finally可以同时出现。例如:

x = [1,2,3]
try:
	print x[2]
except IndexError:
	print 'IndexError'
else:
	print 'NoError'
finally:
	print 'finally...'
print 'end...'
输出结果为:

3
NoError
finally...
end...

3,try没有捕捉到的异常会向上传递到Python进程的顶层,并执行Python默认异常处理逻辑(即Python将终止执行程序,并打印标准错误信息)。

4,try语句是可以嵌套的。

5,raise语句用于手动抛出异常,可以是内置异常,也可以是自定义异常。Python使用类自定义异常。例如:

class MyException:
	pass

try:
	raise MyException
except MyException:
	print 'Error1'
输出结果为:

Error1

6,assert语句功能与raise类似。当assert测试的值为假时,Python就会引发异常。例如:

try:
	x = 1
	assert x==0
except AssertionError:
	print 'AssertionError'
输出结果为:

AssertionError

7,with/as环境管理器可以作为try/finally的替代方案,无论是否发生异常,都将执行中止程序代码。

8,用户自定义的异常类最好是继承自Exception内置异常(但不是必须的)。StandardError是Python所有内置异常的超类。因此实际编程中,可以先捕获StandardErro异常,再捕获用户自定义异常。例如:

class MyException(Exception):
	pass

try:
	print x
except StandardError:
	print 'StandardError'
except MyException:
	print 'MyException'

9,自定义的异常类是可以有构造函数的,raise异常时可以传递数据给构造函数。例如:

class MyException(Exception):
	def __init__(self, x, y):
		self.X = x
		self.Y = y

try:
	raise MyException('error x', 'error y')
except StandardError:
	print 'StandardError'
except MyException, e:
	print 'MyException: ',e.X,e.Y
输出结果为:

MyException:  error x error y

10,raise异常时要后跟异常类的实例,即使是跟一个类的名称,也会自动实例化。可以后跟初始化参数。例如:

class MyException(Exception):
	def __init__(self, x, y):
		self.X = x
		self.Y = y

try:
	raise MyException, ('error x', 'error y')
except StandardError:
	print 'StandardError'
except MyException, e:
	print 'MyException: ',e.X,e.Y
结果与上面相同。





你可能感兴趣的:(Python)