当程序在运行过程中出现的一些错误,或者语法逻辑出现问题,解释器此时无法继续正常执行了,反而出现了一些错误的提示,这就是异常(错误代码或者BUG)
程序在运行过程中出现了异常
轻则功能无法实现,或者功能运行结果出错
重则整个程序崩溃!!!!!
捕获异常是在编程中常用的一种处理代码中可能会出现漏洞的一些基础解决方案
try:
#可能会出现异常的代码
except:
#如果try里面的哪行代码出现异常会直接跳到这里面执行代码
·这种捕获异常存在一个问题,只会捕获异常然后执行except中的处理代码,但是无法得知异常的问题
print(a)
#执行会抛异常
#SyntaxError: invalid character in identifier
#在“:”之前叫异常类,之后叫异常信息
try:
#可能会出现异常的代码
except 可能出现的异常类型:
#如果捕获到异常是指定的这个类型的执行代码
在使用捕获指定异常的时候一定要考虑所有有可能出现的异常类型,如果出现的异常不在所写出的“可能出现的异常类”之中,则会报错
当在捕获异常的时候,可以把要捕获的异常类型的名字,放到except之后,并使用元祖的方式进行体现,或者采用多个except之后放上不同的异常类型的名字
异常类是指在Python内置的一些类,这些类代表了Python中的一些异常问题
异常名称 | 描述 |
---|---|
BaseException | 所有异常的基类 |
SystemExit | 解释器请求退出 |
KeyboardInterrupt | 用户中断执行(通常是输入^C) |
Exception | 常规错误的基类 |
StopIteration | 迭代器没有更多的值 |
GeneratorExit | 生成器(generator)发生异常来通知退出 |
SystemExit | Python 解释器请求退出 |
StandardError | 所有的内建标准异常的基类 |
ArithmeticError | 所有数值计算错误的基类 |
FloatingPointError | 浮点计算错误 |
OverflowError | 数值运算超出最大限制 |
ZeroDivisionError | 除(或取模)零 (所有数据类型) |
AssertionError | 断言语句失败 |
AttributeError | 对象没有这个属性 |
EOFError | 没有内建输入,到达EOF 标记 |
EnvironmentError | 操作系统错误的基类 |
IOError | 输入/输出操作失败 |
OSError | 操作系统错误 |
WindowsError | 系统调用失败 |
ImportError | 导入模块/对象失败 |
KeyboardInterrupt | 用户中断执行(通常是输入^C) |
LookupError | 无效数据查询的基类 |
IndexError | 序列中没有没有此索引(index) |
KeyError | 映射中没有这个键 |
MemoryError | 内存溢出错误(对于Python 解释器不是致命的) |
NameError | 未声明/初始化对象 (没有属性) |
UnboundLocalError | 访问未初始化的本地变量 |
ReferenceError | 弱引用(Weak reference)试图访问已经垃圾回收了的对象 |
RuntimeError | 一般的运行时错误 |
NotImplementedError | 尚未实现的方法 |
SyntaxError | Python 语法错误 |
IndentationError | 缩进错误 |
TabError | Tab 和空格混用 |
SystemError | 一般的解释器系统错误 |
TypeError | 对类型无效的操作 |
ValueError | 传入无效的参数 |
UnicodeError | Unicode 相关的错误 |
UnicodeDecodeError | Unicode 解码时的错误 |
UnicodeEncodeError | Unicode 编码时错误 |
UnicodeTranslateError | Unicode 转换时错误 |
Warning | 警告的基类 |
DeprecationWarning | 关于被弃用的特征的警告 |
FutureWarning | 关于构造将来语义会有改变的警告 |
OverflowWarning | 旧的关于自动提升为长整型(long)的警告 |
PendingDeprecationWarning | 关于特性将会被废弃的警告 |
RuntimeWarning | 可疑的运行时行为(runtime behavior)的警告 |
SyntaxWarning | 可疑的语法的警告 |
UserWarning | 用户代码生成的警告 |
try:
#可能会出现异常的代码
except (指定的异常类型1,指定的异常类型2,...) as 变量:
print(变量)
将捕获的区域中的代码出现的指定的异常问题的描述信息存放在变量中,然后输出
所有异常类的父类都是Exception类
try:
#可能会出现异常的代码
except Exception as 变量:
print(变量)
else表示的是如果没有捕获到异常则需要执行的代码
try:
#可能会出现异常的代码
except (可能出现的异常类型1,可能出现的异常类型2)as 变量:
#如果捕获到异常是指定的这个类型的执行代码
print(变量)
else:
#如果没有捕获到异常则需要执行的代码
finnally表示最终结果,不论代码是否捕获到异常(try中的代码执行之后不管是进入了except还是else)最终都要进入finnally执行
try:
#可能会出现异常的代码
except (可能出现的异常类型1,可能出现的异常类型2)as 变量:
#如果捕获到异常是指定的这个类型的执行代码
print(变量)
else:
#如果没有捕获到异常则需要执行的代码
finnally:
#不论有无bug都执行这一行
可以理解为异常的嵌套:
# 计算1+100
import time
# 程序的时间线
def fun():
try:
res = 0
print("1"+2)
print(time.time())
# 0.0168831
try:
for i in range(1, 101):
res += i
print(res)
time
time.sleep(2)
except:
print("程序被意外终止1")
except:
print("程序被意外终止2")
finally:
print(time.time())
# 0.0178795
return res
print( fun())
在python中一般抛出的异常的语法是异常类对象,这些异常类对象是Python提前封装好的
try:
raise
#用来引发异常,让执行except中的语句
except Exception as res:
#捕获到自定义异常执行代码
else:
#如果没有捕获到异常则需要执行的代码
finnally:
#不论有无bug都执行这一行
需求:检测一些数据例如年龄不能小于0(小于0抛异常)
class AgeInputError(Exception):
def __init__(self, age):
self.age = age
self.minage = 0
def __str__(self):
return f"你输入的年龄是{self.age},不能小于{self.minage}"
def main():
try:
age = int(input("请输入年龄:"))
if age < 0:
# raise 关键字是返回一个异常
raise AgeInputError(age)
except Exception as res:
print(res)
else:
print("年龄无误")
finally:
print("注册完成")
main()
python中的raise关键字用于引发一个异常,基本上作用和C#中或Java中的throw关键字相同
Day19-------END