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 功能开发中应用很广泛,当出现错误后,用于保存错误原因和调试功能很方便。

相关推荐
笃励10 分钟前
Java面试题二
java·开发语言·python
jyan_敬言18 分钟前
【Linux】Linux命令与操作详解(一)文件管理(文件命令)、用户与用户组管理(创建、删除用户/组)
linux·运维·服务器·c语言·开发语言·汇编·c++
FL162386312922 分钟前
[C#]C# winform部署yolov11-pose姿态估计onnx模型
开发语言·yolo·c#
笑非不退33 分钟前
C++ 异步编程 并发编程技术
开发语言·c++
一颗星星辰1 小时前
Python | 第九章 | 排序和查找
服务器·网络·python
打码人的日常分享1 小时前
企业人力资源管理,人事档案管理,绩效考核,五险一金,招聘培训,薪酬管理一体化管理系统(源码)
java·数据库·python·需求分析·规格说明书
27669582921 小时前
京东e卡滑块 分析
java·javascript·python·node.js·go·滑块·京东
unix2linux1 小时前
Parade Series - SHA256
linux·python·mysql·shell
爱写代码的刚子1 小时前
C++知识总结
java·开发语言·c++
martian6651 小时前
QT开发:基于Qt实现的交通信号灯模拟器:实现一个带有倒计时功能的图形界面应用
开发语言·qt