错误
我们执行程序的时候,难免会遇到错误。特别是刚开始学习的时候,会出现很多的语法错误,比如:
>>> while True print('Hello world')
File "<stdin>", line 1, in ?
while True print('Hello world')
^
SyntaxError: invalid syntax
这个例子中,函数 print() 被检查到有错误,是它前面缺少了一个冒号(:)。
语法分析器指出了出错的一行,并且在最先找到的错误的位置标记了一个小小的箭头。
异常
但是很多情况下,我们程序出错不是因为语法错误而引起的,而是由于种种意想不到的原因造成的,这给我们的程序调试造成很大的麻烦,为了提高程序的容错性和方便调试,在某些特定的场合,我们 应该使用异常处理。比如:
py3风格的:
处理单个异常:
try:
print('try...')
r = 10 / 0
print('result:', r)
except ZeroDivisionError as e:
print('except:', e)
else: #没发生异常,就执行
print('no error')
finally:
print('finally...')
print('END')
py2风格:
try:
f=open(filename,'r')
except IOError,e:
return False,str(e)
try语句按照如下方式工作;
- 首先,执行try子句(在关键字try和关键字except之间的语句)
- 如果没有异常发生,忽略except子句,try子句执行后结束。
- 如果在执行try子句的过程中发生了异常,那么try子句余下的部分将被忽略。如果异常的类型和 except
之后的名称相符,那么对应的except子句将被执行。最后执行 try 语句之后的代码。
- 如果一个异常没有与任何的except匹配,那么这个异常将会传递给上层的try中。
同时处理多个异常:
try:
process_some_data()
except (TypeError,ValueError) as reason:
print ("ERROR:you proveide invalid data" +str(reason))
except EXception as reason:
print ("unkownError",reason)
Exception是所有异常的根类,因此如果有异常没有被之前的任何except语句捕获到,那么该异常会在最后一个语句中被处理。
finally语句:
try:
f=open(filename,'r')
except IOError,e:
return False,str(e)
finally:
print 1
无论异常是否发生,都会执行finally下的语句块。
抛出异常:
raise: 抛出异常。
def get_int(obj):
if not isinstance(obj,int):
raise TypeError(“get_int():must pass an integer”)
print %s is a int % obj
assert断言:
assert type(obj.name) is int #只有这一句执行为真才往下执行。否则报错
print('ok')
assert A==B,A must == B
常见的异常关系:
https://docs.python.org/3/library/exceptions.html#exception-hierarchy
例子:对于一个文件,如果打开出错,而又想在finally中关闭该文件的句柄,那么会报错。处理方法如下:
try:
f = open(‘My_File.txt’) # 当前文件夹中并不存在”My_File.txt”这个文件T_T
print(f.read())
except OSError as reason:
print(‘出错啦:’ + str(reason))
finally:
if ‘f’ in locals(): # 如果文件对象变量存在当前局部变量符号表的话,说明打开成功
f.close()
自定义异常类
:
你可以通过创建一个新的exception类来拥有自己的异常。异常应该继承自 Exception 类,或者直接继承,或者间接继承,例如:
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)
输出如下:
My exception occurred, value: 4
raise MyError('oops!')
Traceback (most recent call last):
File "<stdin>", line 1, in ?
__main__.MyError: 'oops!'
附:
参考常见的异常关系: https://docs.python.org/3/library/exceptions.html#exception-hierarchy