python 异常处理

   2023-02-09 学习力0
核心提示:目录python 异常处理异常机制本质try...except...try...except...except...try...except...elsetry...except...else...finally常见异常汇总和说明return 语句和异常处理问题常见异常汇总with…as语句with语句原理trackback 模块raise自定义异常类python 异常

python 异常处理

异常机制本质

异常是指程序运行过程中出现的非正常现象,例如用户输入错误、除数为零、需要处理的文件不存在等

所谓异常处理,就是指程序再出现问题时依然可以正确的执行剩余的程序,而不会因为异常而终止程序的运行

python 中,引进了很多用来描述和处理异常的类,称为异常类。异常类定义中包含了该类异常的信息和对异常进行处理的方法。

python 中一切都是对象,异常也采用对象的方式来处理。处理过程:

  1. 抛出异常: 在执行一个方法时,如果发生异常,则这个方法生成代表该异常的一个对象,停止当前执行路径,并把异常对象提交给解释器。
  2. 捕获异常: 好释器得到该异后,寻相应的代码本处理该异。

try...except...

try:
    a = 3 / 0
except ZeroDivisionError as error:
    print(error) 

# result
# division by zero

try...except...except...

try:
    while True:
        a = int(input("请输入一个数字:"))
        if a == 888:
            break
        b = int(input("请输入一个数字:"))
        if b == 888:
            break
        print("正在计算{0} 除以 {1}".format(a, b))
        calculate = a / b
        print("结果为:{0}".format(calculate))
except ZeroDivisionError:
    print("0 不能做除数!!")
except ValueError:
    print("您输入的不是数字!!!")

"""
result:
请输入一个数字:1
请输入一个数字:0
正在计算1 除以 0
0 不能做除数!!
===========================
请输入一个数字:1
请输入一个数字:abc
您输入的不是数字!!!

"""

try...except...else

try...except...else结构增加了“else块”,如果try中没有抛出异常,则执行else块,如果try块中抛出异常,则执行excetp,不执行else块。

# coding = utf-8
try:

    a = int(input("请输入一个数字:"))

    b = int(input("请输入一个数字:"))

    print("正在计算{0} 除以 {1}".format(a, b))

    calculate = a / b

except ZeroDivisionError:
    print("0 不能做除数!!")
except ValueError:
    print("您输入的不是数字!!!")
else:
    print("结果为:{0}".format(calculate))

"""
result:
请输入一个数字:1
请输入一个数字:10
正在计算1 除以 10
结果为:0.1
================================
请输入一个数字:2
请输入一个数字:0
正在计算2 除以 0
0 不能做除数!!
"""

try...except...else...finally

try...except...else...finally结构中,finally块无论是否发生异常都会被执行,通常用来释放try块中申请的资源。

try:

    a = int(input("请输入一个数字:"))

    b = int(input("请输入一个数字:"))

    print("正在计算{0} 除以 {1}".format(a, b))

    calculate = a / b

except ZeroDivisionError:
    print("0 不能做除数!!")
except ValueError:
    print("您输入的不是数字!!!")
else:
    print("结果为:{0}".format(calculate))
finally:
    print("程序结束")

"""
result:
请输入一个数字:1
请输入一个数字:0
正在计算1 除以 0
0 不能做除数!!
程序结束
==============================
请输入一个数字:1
请输入一个数字:2
正在计算1 除以 2
结果为:0.5
程序结束
"""

常见异常汇总和说明

return 语句和异常处理问题

由于 return 有两种作用:结束方法运行、返回值。我们一般不把 return 放到异常处理结构中,而是放到方法最后。
异常结构中return的使用方式

def test01():
    print('step1')
    try:
        x = 3 / 0
        # return 'a'
    except:
        print('step2')
        print('异常:0不能作为除数')
        # return 'b'
    finally:
        print('step3')
        # return 'c'

    print('step4')
    return 'd'  # 老师:一般不要把return语句放到try、except、else、finally块中,会发生一些意想不到的错误。建议放到最后。


print(test01())

"""
result:

step1
step2
异常:0不能作为除数
step3
step4
d
"""

return不在最后,所以执行到return本来程序执行要终止,但是还是会把finally块的代码执行完,之后就不执行了。
异常结构中return的使用方式

def test01():
    print('step1')
    try:
        x = 3 / 0
        # return 'a'
    except:
        print('step2')
        print('异常:0不能作为除数')
        return 'b'
    finally:
        print('step3')
        # return 'c'

    print('step4')
    # return 'd'  # 一般不要把return语句放到try、except、else、finally块中,会发生一些意想不到的错误。建议放到最后。


print(test01())

"""
result:
step1
step2
异常:0不能作为除数
step3
b
"""

常见异常汇总

异常名称 说明
ArithmeticError 所有数值计算错误的基类
AssertionError 断言语句失败
AttributeError 对象没有这个属性
BaseException 所有异常的基类
DeprecationWarning 关于被弃用的特征的警告
EnvironmentError 操作系统错误的基类
EOFError 没有内建输入,达到EOF标记
Exception 常规错误的基类
FloatPointError 浮点计算错误
FutureWarning 关于构造语义将来会有改变的警告
GeneratorExit 生成器(generator)发生异常,通知退出
ImportError 导入模块/对象失败
IndentationError 缩进错误
IndexError 序列中没有此索引
IOError 输入/输出操作失败
KeyboardInterrupt 用户中断执行(通常是输入^C)
KeyError 映射中没有这个键
LookupError 无效查询的基类
MemoryError 内存溢出错误(对Python解释器来说不是致命的)
NameError 未声明/初始化对象(没有属性)
NotImplementedError 尚未实现的方法
OSError 操作系统错误
OverflowError 数值运算超出最大限制
OverflowWarning 旧的关于自动提升为长整型(long)的警告
PendingDeprecationWarning 关于特性将会被废弃的警告
ReferenceError 弱引用(Weak Reference)试图访问已经垃圾回收了的对象
RuntimeError 一般的运行时错误
RuntimeWarning 可以的运行时行为(Runtime Behavior)的警告
StandardError 所有内建标准异常的基类
StopIteration 迭代器没有更多的值
SyntaxError Python语法错误
SyntaxWarning 可以的语法的警告
SystemError 一般的解释器系统错误
SystemExit 解释器请求退出
TabError Tab和空格键混用
TypeError 对类型无效的操作
UnboundLocalError 访问未初始化的本地变量
UnicodeDecodeError Unicode编码时的错误
UnicodeError Unicode相关的错误
UnicodeTranslateError Unicode转换时的错误
UserWarning 用户代码生成的警告
ValueError 传入无效的参数
Warning 警告的基类
WindowsError 系统调用失败
ZeroDivisionError 除(或取模)零(所有数据类型)

with…as语句

with通过__enter__方法初始化,然后在__exit__中做善后以及处理异常。其中__enter__()方法在语句体(with语句包裹起来的代码块)执行之前进入运行,exit()方法在语句体执行完毕退出后运行。

with 语句适用于对资源进行访问的场合,确保不管使用过程中是否发生异常都会执行必要的“清理”操作,释放资源,比如文件使用后自动关闭、线程中锁的自动获取和释放等。

With语句的基本语法格式:

with expression [as target]:
	with-block 
    
expression:是一个需要执行的表达式;
target:是一个变量或者元组,存储的是expression表达式执行返回的结果,可选参数。

with语句原理

上下文管理协议(Context Management Protocol):包含方法 enter()和__exit__(),支持该协议的对象要实现这两个方法。

上下文管理器(Context Manager):支持上下文管理协议的对象,这种对象实现了__enter__()和__exit__()方法。上下文管理器定义执行with语句时要建立的运行时上下文,负责执行with语句块上下文中的进入与退出操作。通常使用with语句调用上下文管理器,也可以通过直接调用其方法来使用。
例:执行过程:

with EXPR as VAR:
    BLOCK
  1. 执行EXPR,生成上下文管理器context_manager;

  2. 获取上下文管理器的__exit()__方法,并保存起来用于之后的调用;

  3. 调用上下文管理器的__enter__()方法;如果使用了as子句,则将__enter__()方法的返回值赋值给as子句中的VAR;

  4. 执行BLOCK中的表达式;

  5. 不管是否执行过程中是否发生了异常,执行上下文管理器的__exit__()方法,exit()方法负责执行“清理”工作,如释放资源等。如果执行过程中没有出现异常,或者语句体中执行了语句break/continue/return,则以None作为参数调用__exit__(None, None, None);如果执行过程中出现异常,则使用sys.exc_info得到的异常信息为参数调用__exit__(exc_type, exc_value, exc_traceback);

  6. 出现异常时,如果__exit__(type, value, traceback)返回False,则会重新抛出异常,让with之外的语句逻辑来处理异常,这也是通用做法;如果返回True,则忽略异常,不再对异常进行处理。

trackback 模块

程序很多时候是服务器在运行,不会时时刻刻有人在电脑前看着,应用Trackback模块将错误信息写入日志文件中,可以便于运维人员定期去翻阅异常记录文件查错。

*【例】使用 Traceback 模块打印异常信息 *

import traceback

try:
    print('step1')
    num = 1 / 0
except:
    # open()的'a'模式(可以联系append方法去理解和记忆),打开一个文件用于追加。如果该文件已
    with open(r"traceback.txt", 'a') as f:
        # 存在,文件指针将会放在文件的结尾,也就是说新的内容会被写入到已有内容之后;如果该文件不存在,创建新文件进行写入。
        traceback.print_exc(file=f)

raise自定义异常类

程序开发中,有时候我们也需要自己定义异常类。自定义异常类一般都是运行时异常,通常继承 Exception或其子类即可。命名一般以Error、Exception 为后缀。

自定义异常由 raise 语句主动抛出,一般自定义异常需要重写__str__方法:

class AgeError(Exception):

    def __init__(self, errorinfo):
        super().__init__(self)
        self.errorinfo = errorinfo

    def __str__(self):
        return str(self.errorinfo) + "这个年龄超出范围,"+ "年龄应该在1到150之间"


if __name__ == "__main__":
    age = int(input("输入一个年龄:"))
    if age > 1 and age < 150:
        print("年龄是:{0}".format(age))
    else:
        raise AgeError(age)

"""
result:

输入一个年龄:19
年龄是:19
=============================

Traceback (most recent call last):
  File "c:\Users\chenh\OneDrive\Data Learn\Python 基础\课堂笔记\09\try.py", line 16, in <module>
    raise AgeError(age)
AgeError: 200这个年龄超出范围,年龄应该在1到150之间

"""
 
反对 0举报 0 评论 0
 

免责声明:本文仅代表作者个人观点,与乐学笔记(本网)无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
    本网站有部分内容均转载自其它媒体,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责,若因作品内容、知识产权、版权和其他问题,请及时提供相关证明等材料并与我们留言联系,本网站将在规定时间内给予删除等相关处理.

  • SICP:复数的直角和极坐标的表示(Python实现)
    SICP:复数的直角和极坐标的表示(Python实现)
    数据抽象屏障是控制复杂性的强有力工具,然而这种类型的数据抽象还不够强大有力。从一个另一个角度看,对于一个数据对象可能存在多种有用的表示方式,且我们希望所设计的系统能够处理多种表示形式。比如,复数就可以表示为两种几乎等价的形式:直角坐标形式(
    03-16
  • 详解Python手写数字识别模型的构建与使用
    详解Python手写数字识别模型的构建与使用
    目录一:手写数字模型构建与保存1 加载数据集2 特征数据 标签数据3 训练集 测试集4 数据流图 输入层5 隐藏层6 损失函数7 梯度下降算法8 输出损失值 9 模型 保存与使用10 完整源码分享二:手写数字模型使用与测试一:手写数字模型构建与保存1 加载数据集# 1加
  • Python asyncore socket客户端实现方法详解
    Python asyncore socket客户端实现方法详解
    目录介绍1.定义类并且继承 asyncore.dispatcher2.实现类中的回调代码调用父类方法创建socket对象连接服务器3.创建对象并且执行asyncore.loop进入运行循环服务端示例代码运行结果注意介绍asyncore库是python的一个标准库,提供了以异步的方式写入套接字服务的
  • Python+Sklearn实现异常检测
    目录离群检测 与 新奇检测Sklearn 中支持的方法孤立森林 IsolationForestLocal Outlier FactorOneClassSVMElliptic Envelope离群检测 与 新奇检测很多应用场景都需要能够确定样本是否属于与现有的分布,或者应该被视为不同的分布。离群检测(Outlier detectio
  • Python基础教程之while循环用法讲解 Python中的while循环
    Python基础教程之while循环用法讲解 Python中的
    目录1.while 循环2.无限循环3、while 循环使用 else 语句4、简单语句组附小练习:总结1.while 循环Python 中 while 语句的一般形式:while 判断条件(condition):    执行语句(statements)……执行流程图如下:同样需要注意冒号和缩进。另外,在 Python 中
  • Python异常与错误处理详细讲解 python的异常
    基础知识优先使用异常捕获LBYL(look before you leap): 在执行一个可能出错的操作时,先做一些关键的条件判断,仅当满足条件时才进行操作。EAFP(eaiser to ask for forgiveness than permission): 不做事前检查,直接执行操作。后者更优: 代码简洁,效率更高
  • Python Flask利用SocketIO库实现图表的绘制
    Python Flask利用SocketIO库实现图表的绘制
    目录实现简单的数据通信使用SocketIO库绘制主机动态图形Flask 默认提供了针对WebSocket的支持插件from flask_socketio import SocketIO 直接通过pip命令安装即可导入使用,前端也需要引入socketIO库文件,其网站首页是:socket.io/实现简单的数据通信新建inde
  • Python matplotlib之折线图的各种样式与画法总结
    Python matplotlib之折线图的各种样式与画法总
    目录1. 折线形状2. 数据点形状3. 折线颜色4. 添加网格总结上述图的完整代码如下:from numpy import *import numpy as npimport pandas as pdimport matplotlib.pyplot as pltimport pylab as plfrom mpl_toolkits.axes_grid1.inset_locator import inset_axe
  • Python多线程与同步机制浅析
    目录线程实现Thread类函数方式继承方式同步机制同步锁Lock条件变量Condition信号量Semaphore事件Event屏障BarrierGIL全局解释器锁线程实现Python中线程有两种方式:函数或者用类来包装线程对象。threading模块中包含了丰富的多线程支持功能:threading.curren
  • 手把手教你用python绘制热度图(heatmap) python热图怎么画
    手把手教你用python绘制热度图(heatmap) python
    目录1、简单的代码2、添加X轴和Y轴标签和标题:3、对右侧的色条(colorbar)进行调整:4、修改色条的刻度值和标签的字体大小、颜色:5、对热度图显示数值和添加网格线:6、 定义热度图的配色板总结1、简单的代码from matplotlib import pyplot as pltimport sea
点击排行