python 用 异常对象(exception object)来表示异常情况。异常对象可以被处理、捕获,避免程序终止执行
Exception 所有异常的基类
AttributeError 特征引用或者赋值失败时引发的
IOError 试图打在不存在的文件(包括其他情况)
IndexError 使用序列中不存在的索引
KeyError 使用映射中不存在的键
NameError 找不到名字(变量)
SyntaxError 在代码为错误形式时引发
SystemExit 系统异常退出
TypeError 在内建操作或者函数应用与错误类型的对象时
ValueError 正确的类型对象,但是对象使用不合适的值
ZeroDivisionError 除法,第二参数为0
自定义异常
可以创建一个新的exception类来拥有自己的异常。异常应该继承自 Exception 类,或者直接继承,或者间接继承
class MyError(Exception):
pass
#自定义异常也可以在类里面定义方法
捕捉异常
基本语法:
try: #需要执行的操作 except 异常类 as e: #如果发生异常,执行以下代码 else: #如果没有发生异常,执行的命令 finally: #无论如何,都要执行的代码
注意 except as e 的写法,e 是一个变量,记录了异常的类,可以用 print 函数打印出来
- except 后面的异常类,建议写 Exception,这样就一定能捕获到异常。
捕获到异常,就不会去执行 else 模块
- 示例:
try:
name = input('Please input your name: ')
print('Hello %s' %name)
print(10/0)
except Exception as e:
print('Got an error ', e)
finally:
print('Game over')
捕获多个异常
- 方法一(不同异常不同处理方式):
try:
需要执行的操作
except 异常类 as e:
如果发生异常,执行以下代码
except 异常类 as f:
如果发生异常,执行以下代码
else:
如果没有发生异常,执行的命令
finally:
无论如何,都要执行的代码
- except 后面的异常类,如果无需指定,直接写 Exception 即可。
- 如果需要明确指定异常的类,而且是多个类的情况下,可以使用多个 except 语句。
- 方法二(多个异常统一处理):
try:
需要执行的操作
except (异常类1,异常2,异常3) as e:
如果发生异常,执行以下代码
else:
如果没有发生异常,执行的命令
finally:
无论如何,都要执行的代码
抛出异常
raise 关键字可以自主抛出异常,规则如下:
raise NameError([str])
raise 后面跟异常的类,类括号里面,可以指定要抛出的异常示例,约详细越好
>>> raise NameError()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError
>>> raise NameError('bad name')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: bad name
raise 如果用在 try / except 语句中,那么会直接抛出异常,并终止程序运行。不影响 finally 语句的执行。
raise 如果用在 try / except 语句中,那么会直接抛出异常,并终止程序运行。不影响 finally 语句的执行。
while True:
try:
a = input('Plase input a number: ')
b = input('Plase input a number: ')
print(a/b)
except Exception as e:
print('Error happend, please do agin')
raise e
else:
print('No error happend')
异常实现循环
- 在循环没有异常的情况下,才会退出循环。
while True:
try:
a = input('Plase input a number: ')
b = input('Plase input a number: ')
print(a/b)
except Exception as e:
print('Error happend, please do agin')
print(e)
else:
print('No error happend')