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

相关推荐
Elihuss2 小时前
ONVIF协议操作摄像头方法
开发语言·php
Swift社区5 小时前
在 Swift 中实现字符串分割问题:以字典中的单词构造句子
开发语言·ios·swift
没头脑的ht5 小时前
Swift内存访问冲突
开发语言·ios·swift
没头脑的ht5 小时前
Swift闭包的本质
开发语言·ios·swift
wjs20245 小时前
Swift 数组
开发语言
stm 学习ing6 小时前
FPGA 第十讲 避免latch的产生
c语言·开发语言·单片机·嵌入式硬件·fpga开发·fpga
Estar.Lee6 小时前
查手机号归属地免费API接口教程
android·网络·后端·网络协议·tcp/ip·oneapi
湫ccc7 小时前
《Python基础》之字符串格式化输出
开发语言·python
mqiqe8 小时前
Python MySQL通过Binlog 获取变更记录 恢复数据
开发语言·python·mysql