Python 异常处理

当程序遇到问题时不让程序结束,而通过错误继续向下执行。

概述

作用

用来检测try语句块中的错误,从而让except语句捕获错误信号并处理

格式

python 复制代码
try:
    处理语句
except 错误类型 as e:
    错误1执行语句
except 错误类型 as e:
    错误2执行语句
.....
except 错误类型 as e:
    错误n执行语句
else:
    语句

注意:else语句可有可无

逻辑

当程序执行到try-except-else语句时:

1.如果当try"处理语句"执行出现错误,会匹配第一个错误类型,

如果匹配上就执行对应"语句"

2.如果当try"处理语句"执行出现错误,没有匹配的异常类型,

错误将会被提交到上一层的try语句;或者到程序的最上层。

3.如果设置else了当try"处理语句"执行没有出现错误,执行else下的"语句。

简单的异常处理

使用except而不是用任何错误类型

示例如下:

python 复制代码
try:
    # 一个未定义的变量
    name
except:
    print('程序出现错误!')

# 执行结果
# 程序出现错误!

判断错误类型处理

通过数值类型的1加字符串类型的1111,因为try-except程序没有抛出异常并终止操作;

而是检测到错误类型给出相应提示并继续执行。

示例如下:

python 复制代码
try:
    print(1 + '1111')
except NameError as e:
    print('名称未定义:', e)
except TypeError as e:
    print('类型错误:', e)

print('------- END -------')

# 执行结果
# 类型错误: unsupported operand type(s) for +: 'int' and 'str'
# ------- END -------

并行检测多种异常

还可以使用except并行检测多中异常,如下对名称错误和类型错误进行相同处理。

示例如下:

python 复制代码
try:
    print(1 + '1111')
except (NameError, TypeError) as e:
    print('名称错误 or 类型错误:', e)

print('------- END -------')

# 执行结果
# 名称错误 or 类型错误: unsupported operand type(s) for +: 'int' and 'str'
# ------- END -------

使用else

else可根据情况添加,可用于设置依赖上面处理成功才可执行的操作;

如果上面执行出错,则不会执行else内容。

示例如下:

python 复制代码
try:
    num = 1
except (NameError, TypeError) as e:
    print('名称错误 or 类型错误:', e)
else:
    num += 1
    print('代码执行成功', num)

# 执行结果
# 代码执行成功 2

使用基础异常类

错误其实是class(类),所有的错误都是继承自BaseException,

所以可以使用它捕获所有类型(包括子类)的错误。

示例如下:

python 复制代码
try:
    print(1 + '1111')
except BaseException as e:
    print('基类异常捕获:', e)
except TypeError as e:
    print('类型错误:', e)

print('------- END -------')

# 执行结果
# 基类异常捕获: unsupported operand type(s) for +: 'int' and 'str'
# ------- END -------

跨越多层调用

在main中调用fun2,fun2方法中调用fun1。但只是在main方法中进行捕获错误,

也可以捕获到调用fun1产生的错误。

示例如下:

python 复制代码
def fun1(num):
    print(1 / num)
def fun2(num):
    fun1(num)
def main():
    fun2(0)

try:
    main()
except ZeroDivisionError as e:
    print('出现了错误')

# 执行结果
# 出现了错误

断言

断言也就是assert 语句,通常用于检查用户的输入是否符合规定,还经常用作程序初期测试和调试过程中的辅助工具;当出现设置的断言时,程序会抛出相应设置错误,这有利于对程序进行拍错,提高程序的健壮性。

示例如下:

python 复制代码
def get_student(name):
    assert (type(name) == str), 'name 必须为字符串类型'

    print(name)


get_student(11)

当结果为True时,程序继续执行;否则抛出设置错误。

结果如下:

bash 复制代码
Traceback (most recent call last):
  File "E:\lianxipy\day3\异常处理.py", line 88, in <module>
    get_student(11)
  File "E:\lianxipy\day3\异常处理.py", line 83, in get_student
    assert (type(name) == str), 'name 必须为字符串类型'
AssertionError: name 必须为字符串类型

finally

格式:try-except-finally

作用:finally中的语句无论是否有错误都将执行。

示例如下:

python 复制代码
try:
    num
except NameError as e:
    print('名称错误:', e)
except TypeError as e:
    print('类型错误:', e)
finally:
    print('必须执行语句')

# 执行结果
# 名称错误: name 'num' is not defined
# 必须执行语句

标准异常列表

|---------------------------|-----------------------------------|
| 异常名称 | 描述 |
| BaseException | 所有异常的基类 |
| SystemExit | 解释器请求退出 |
| KeyboardInterrupt | 用户中断执行(通常是输入^C) |
| Exception | 常规错误的基类 |
| StopIteration | 迭代器没有更多的值 |
| GeneratorExit | 生成器(generator)发生异常来通知退出 |
| StandardError | 所有的内建标准异常的基类 |
| ArithmeticError | 所有数值计算错误的基类 |
| FloatingPointError | 浮点计算错误 |
| OverflowError | 数值运算超出最大限制 |
| ZeroDivisionError | 除(或取模)零 (所有数据类型) |
| AssertionError | 断言语句失败 |
| AttributeError | 对象没有这个属性 |
| EOFError | 没有内建输入,到达EOF 标记 |
| EnvironmentError | 操作系统错误的基类 |
| IOError | 输入/输出操作失败 |
| OSError | 操作系统错误 |
| WindowsError | 系统调用失败 |
| ImportError | 导入模块/对象失败 |
| 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 | 用户代码生成的警告 |

总结

异常处理在python 功能开发中应用很广泛,当出现错误后,用于保存错误原因和调试功能很方便。

相关推荐
喵叔哟2 分钟前
重构代码之用委托替代继承
开发语言·重构
lzb_kkk8 分钟前
【JavaEE】JUC的常见类
java·开发语言·java-ee
SEEONTIME8 分钟前
python-24-一篇文章彻底掌握Python HTTP库Requests
开发语言·python·http·http库requests
Bearnaise8 分钟前
PointMamba: A Simple State Space Model for Point Cloud Analysis——点云论文阅读(10)
论文阅读·笔记·python·深度学习·机器学习·计算机视觉·3d
起名字真南27 分钟前
【OJ题解】C++实现字符串大数相乘:无BigInteger库的字符串乘积解决方案
开发语言·c++·leetcode
tyler_download38 分钟前
golang 实现比特币内核:实现基于椭圆曲线的数字签名和验证
开发语言·数据库·golang
小小小~39 分钟前
qt5将程序打包并使用
开发语言·qt
hlsd#39 分钟前
go mod 依赖管理
开发语言·后端·golang
哇咔咔哇咔39 分钟前
【科普】conda、virtualenv, venv分别是什么?它们之间有什么区别?
python·conda·virtualenv
小春学渗透41 分钟前
Day107:代码审计-PHP模型开发篇&MVC层&RCE执行&文件对比法&1day分析&0day验证
开发语言·安全·web安全·php·mvc