Python 异常处理

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

概述

作用

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

格式

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而不是用任何错误类型

示例如下:

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

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

判断错误类型处理

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

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

示例如下:

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并行检测多中异常,如下对名称错误和类型错误进行相同处理。

示例如下:

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内容。

示例如下:

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

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

使用基础异常类

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

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

示例如下:

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产生的错误。

示例如下:

def fun1(num):
    print(1 / num)
def fun2(num):
    fun1(num)
def main():
    fun2(0)

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

# 执行结果
# 出现了错误

断言

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

示例如下:

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

    print(name)


get_student(11)

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

结果如下:

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中的语句无论是否有错误都将执行。

示例如下:

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个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JSON_L

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值