初识异常处理
如下面的例子:
让用户进行输入,提示用户输入一个数字,如果输入的事一个数字那个就把输入的数字转换为int
类型,然后输出用户输入的而数字,如果用户输入的不是一个数字,那么类型转换就会出错,如果出错,就提示用户”输入类型错误,你因该输入的是一个数字。”
#!/usr/bin/env python
# _*_coding:utf-8 _*_
try:
n = int(input("请输出一个数字>>> "))
print("你输入的数字是",n)
# e是Exception的对象,Exception是一个类
except Exception as e:
print("输入类型错误,你因该输入的是一个数字。")
输出
Guniao@Darker:~$ python3 /home/Guniao/文档/Python_code/sublime/Week06/Day04/s2.py
请输出一个数字>>> 123
你输入的数字是 123
Guniao@Darker:~$ python3 /home/Guniao/文档/Python_code/sublime/Week06/Day04/s2.py
请输出一个数字>>> abc
输入类型错误,你因该输入的是一个数字。
异常分类
常用异常
异常名 | 说明 |
AttributeError | 试图访问一个对象没有的树形,比如foo.x,但是foo没有属性x |
IOError | 输入/输出异常;基本上是无法打开文件 |
ImportError | 无法引入模块或包;基本上是路径问题或名称错误 |
IndentationError | 语法错误(的子类) ;代码没有正确对齐 |
IndexError | 下标索引超出序列边界,比如当x只有三个元素,却试图访问x[5] |
KeyError | 试图访问字典里不存在的键 |
KeyboardInterrupt | Ctrl+C被按下 |
NameError | 使用一个还未被赋予对象的变量 |
SyntaxError | Python代码非法,代码不能编译(个人认为这是语法错误,写错了) |
TypeError | 传入对象类型与要求的不符合 |
UnboundLocalError | 试图访问一个还未被设置的局部变量,基本上是由于另有一个同名的全局变量,导致你以为正在访问它 |
ValueError | 传入一个调用者不期望的值,即使值的类型是正确的 |
对不同的异常进行不同的处理
try:
n = int(input("请输出一个数字>>> "))
except ValueError as e:
print("ValueError错误")
except Exception as e:
print("出现异常")
输出
Guniao@Darker:~$ python3 /home/Guniao/文档/Python_code/sublime/Week06/Day04/s2.py
请输出一个数字>>> 123
Guniao@Darker:~$ python3 /home/Guniao/文档/Python_code/sublime/Week06/Day04/s2.py
请输出一个数字>>> asd
ValueError错误
在处理异常时,如果出现错误,那么会首先匹配ValueError
,然后在匹配Exception
。
捕获多个错误
try:
raise IndexError('出错了')
except (IndexError, NameError) as e: # 捕获括号内的错误,并把错误信息赋值给e
print(e)
错误异常的基本结构
try:
# 主代码块
pass
except KeyError as e:
# 异常时,执行该块
pass
else:
# 主代码块执行完,执行该块
pass
finally:
# 无论异常与否,最终执行该块
pass
执行流程:
- 如果出现错误,那么就执行
except
代码块,然后在执行finally
- 如果没有出现错误,那么就执行
else
代码块,然后再执行finally
- 不管有没有出现异常都会执行
finally
主动出发异常
#!/usr/bin/env python
# _*_coding:utf-8 _*_
try:
# raise表示主动出发异常,然后创建一个Exception对象,Exception括号内的值就是Exception对象的值
raise Exception("主动出发的异常")
except Exception as e:
# 输出Exception对象的值
print(e)
输出
Guniao@Darker:~$ python3 /home/Guniao/文档/Python_code/sublime/Week06/Day04/s2.py
主动出发的异常
如果需要捕获和处理一个异常,又不希望异常在程序中死掉,一般都会利用raise传递异常
>>> try:
... raise IndexError('Index')
... except IndexError:
... print('error')
... raise
...
error
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
IndexError: Index
断言
如果条件成立则成立,如果条件不成立则报错。
# assert关键字,后面的是条件
>>> assert 1 == 1
>>> assert 1 == 2
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AssertionError
自定义异常
用户自定义的异常通过类编写,且通常需要继承Exception
内置的异常类,基于类的异常允许脚本建立异常类型、继承行为以及附加状态信息。
>>> class Bar(Exception):
... pass
...