Python 篇章(十八)

Python 异常处理

python提供了两个非常重要的功能来处理python程序在运行中出现的异常和错误。你可以使用该功能来调试python程序。

  • 异常处理
  • 断言(Assertions)

一、异常处理

1. python 异常码

异常名称 描述
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 用户代码生成的警告

2. try--except--else 语句

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

  • 逻辑:当 try “语句t” 执行时出现错误,会匹配第一个错误码,如果匹配的上就执行对应的“语句”;如果没有匹配的异常,错误将会被提交到上一层的try语句。或者到程序的最上层;如果当 try “语句t” 执行时没有出现错误,执行else下的“语句e”,

  • 格式:

try:
    语句t
except 错误码 as e:
    语句1
except 错误码 as e:
    语句2
......
except 错误码 as e:
    语句n
else:
    语句e
  • 示例
#1 使用except而不使用任何的错误类型。{这是比较常用的 ~_~ }
try:
    print(4 / 0)
except:
    print("这行的程序出现了错误")
else:
    print("very good")
# 意思就是我不管这个程序到底出现了什么错误,只要有错误,我就print打印一个错误日志,并且让他越过这个错误继续向下执行代码

print("@@@@@@@@@@@@@@@@@")


#2 当程序遇到问题的时不让程序结束,而是越过错误继续向下执行
try:
    # print(3 / 2)       # 没有问题的程序
    # print(3 / 0)       # 错误码 ZeroDivisionError
    # print(num)         # 错误码 NameError
except ZeroDivisionError as a:
    print("程序出现ZeroDivisionError问题")
except NameError as a:
    print("程序出现NameError问题")
else:
    print("very good")

print("******************")


#3 使用except带着多种异常。{与上面的意思相同,只不过就是将多个except语句简化成了一个}
try:
    print(3 / 2)            #没有问题的程序
    # print(3 / 0)          #错误码 ZeroDivisionError
    # print(num)            #错误码 NameError
except (ZeroDivisionError, NameError):
    print("出现了ZeroDivisionError或NameError")
else:
    print("very good")

print("###########################")
  • 他的特殊性

错误其实就是class(类),所有的错误都继承自BaseException,所以在捕获的时候,他能捕获该自身类型的错误,也能捕获他的子类

# 代码示例1
try:
    print(5 / 0)                 # 错误码 ZeroDivisionError
except BaseException as e:
    print("“父类”错误")
except ZeroDivisionError as e:
    print("“子类”错误")

# 思考:讲道理应该执行下面的(“子类”错误),但执行的确是上面的(“父类”错误);这是为什么?

# 因为BaseException错误是ZeroDivisionError错误的父类,所以BaseException错误直接继承了ZeroDivisionErro的错误


# 代码示例2
# 跨越多层调用,main调用了func2,func2调用了func1,func1出现了错误,只要main捕获到了就可以处理
def func1(num):
    print(1 / num)                # 1 / 0;报错:ZeroDivisionError
def func2(num):
    func1(num)                    # 调用了func1()函数;并且把自身num的值:0传递给了func1
def main():
    func2(0)                      # 调用了func2()函数;并且给func2传递了一个值:0
try:
    main()                        # -->调用了main()函数
except ZeroDivisionError as e:    # except程序发现有这个ZeroDivisionError错误码,执行他下方的语句,没有就执行else下的语句
    print("******")               # 执行完后越过错误继续向下执行
else:
    print("very good")            # 执行后继续向下执行

print("lemon is a handsome")      # 执行完毕后退出程序

3. try--except--finally语句

  • 作用:语句 t 不管有没有错误都将执行最后的语句 f
  • 格式
try:
    语句t
except 错误码 as e:
    语句t1
except 错误码 as e:
    语句t2
......
except 错误码 as e:
    语句n
finally:
    语句f
  • 示例
try:
    print(5 / 0)
except:
    print("“错误”,除数不能为0")
finally:
    print("不管except有没有错,都必须执行我")

二、断言

  • 作用:

    • python assert 断言句语格式及用法很简单。在没完善一个程序之前,我们不知道程序在哪里会出错,与其让它在运行时崩溃,不如在出现错误条件时就崩溃,这时候就需要assert断言的帮助。
  • 格式:

    assert expression
    
    • 等价于:
    if not expression:
        raise AssertionError
    
    • assert 后面也可以紧跟参数:
    assert expression [, arguments]
    
    • 等价于:
    if not expression:
        raise AssertionError(arguments)
    
  • 示例

    def func(num, div):
        assert (div != 0), "div不能为0"
        return num / div
    
    res = func(10, 0)
    print(res)
    
posted @   ArMinLi  阅读(8)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示