异常处理
一、认识异常
1.异常本身就是异常类的实例
try
:将可能会发生异常的代码放在try中,进行尝试性执行
except
:except用来捕获异常,并进行响应的处理
else
:else在没有异常的时候会执行
finally
:finally不管是否有异常,都会执行
2.Python的异常结构(基于继承)
在 Python 中所有的异常都是继承自 BaseException
,直接分为四大类:
SystemExit
:Python退出异常
KeyboardInterrupt
: 键盘打断(Ctrl+C)
GeneratorExit
: 生成器退出
Exception
: 普通异常(代码只会出现这部分的异常)
3.查找报错原因
查看:报错原因+报错行+执行的代码
二、异常处理
1.基本的 try…except…
# 基本语法
try:
先执行,异常,捕获异常,执行 except 里面的代码
先执行,无异常,不再执行 except 里面的代码
except:
捕获异常时,执行的功能块
例:
try:
a = 5 - b # NameError: name 'b' is not defined
except:
print("发生了异常")
print("继续执行")
**********************************************************************
发生了异常
继续执行
2.捕获具体的异常
捕获到想要捕获的异常,处理
try:
1/0 # ZeroDivisionError: division by zero
except ZeroDivisionError:
print("发生了异常")
print("继续执行")
**********************************************************************
发生了异常
继续执行
没有捕获到想要捕获的的异常,正常抛出异常
try:
1/0 # ZeroDivisionError: division by zero
except NameError:
print("发生了异常")
print("继续执行")
**********************************************************************
ZeroDivisionError: division by zero
3.捕获多种异常
关于 Exception 及其子类的解释:
代码中会出现的异常都是 Exception 的子类, 因此在 except 中只需要在最后加上 Exception 即可
在抛出异常的过程中,会从上到下依次对比异常,找到之后就不会再往后查找
try:
5 - "a" # TypeError: unsupported operand type(s) for -: 'int' and 'str'
except NameError:
print("NameError")
except ZeroDivisionError:
print("ZeroDivisionError")
except TypeError:
print("TypeError")
except Exception:
print("Exception")
print("继续执行")
**********************************************************************
TypeError
继续执行
4.查看异常描述
try:
5 - "a" # TypeError: unsupported operand type(s) for -: 'int' and 'str'
except NameError:
print("NameError")
except ZeroDivisionError:
print("ZeroDivisionError")
except TypeError as e:
print("TypeError")
print(e)
except Exception:
print("Exception")
print("继续执行")
**********************************************************************
TypeError
unsupported operand type(s) for -: 'int' and 'str'
继续执行
5.else 与 finally
# else: 有异常时不执行,无异常时执行
# finally: 有无异常时,都执行
例:有异常
try:
a = 5 - b # NameError: name 'b' is not defined
except:
print("发生了异常")
else:
print("else")
finally:
print("finally")
**********************************************************************
发生了异常
finally
例:无异常
try:
a = 5
except:
print("发生了异常")
else:
print("else")
finally:
print("finally")
**********************************************************************
else
finally
6.raise (主动抛出异常)
try:
raise TypeError("主动抛出的异常错误")
except TypeError as a:
print("类型错误")
print(a)
except FileNotFoundError as b:
print("文件错误")
print("b")
except Exception as c:
print("其他异常错误")
print(c)
**********************************************************************
类型错误
主动抛出的异常错误
实际应用
def func(name):
if name == "zzh":
raise TypeError("黑名单用户,拒绝访问")
func("zzh")
**********************************************************************
TypeError: 黑名单用户,拒绝访问
自定义异常类型
class BleaklistError(Exception):
pass
def func(name):
if name == "zzh":
raise BleaklistError("黑名单用户,拒绝访问")
else:
print("欢迎访问")
func("zzh")
**********************************************************************
__main__.BleaklistError: 黑名单用户,拒绝访问
7.常见异常类型
异常名 | 解释 |
---|---|
AttributeError | 试图访问一个对象没有的属性 |
IOError | 输入/输出异常 |
ImportError | 无法引入模块或包;多是路径问题或名称错误 |
IndentationError | 缩进错误 |
IndexError | 下标索引错误 |
KeyError | 试图访问不存在的键 |
KeyboardInterrupt | Ctrl+C被按下,键盘终止输入 |
NameError | 使用未定义的变量 |
SyntaxError | 语法错误 |
TypeError | 传入对象的类型与要求的不符合 |
UnboundLocalError | 试图访问一个还未被设置的局部变量 |
ValueError | 传入一个调用者不期望的值,即使值的类型是正确的 |
OSError | 操作系统执行错误 |
三、断言 assert
1.概念
断言主要用于代码调试,其实可以用print()方法代替
语法:assert 条件
- 条件不满足时,抛出
AssertionError
异常,后续程序终止 - 条件满足时,正常执行
2.举例
条件不满足
a = 1
b = 2
print(a > b) # False
print(a < b) # True
assert a > b
print("ok")
**********************************************************************
False
True
AssertionError
条件满足
a = 1
b = 2
print(a > b) # False
print(a < b) # True
assert a < b
print("ok")
**********************************************************************
False
True
ok