Python异常捕获与抛出以及With语句简介

2023-05-16

目录

捕获异常

抛出异常

预定义清理行为with

@contextmanager

@closing

常见异常


Python3使用try ... except [else]来捕获异常,且要求异常必须继承Exception 类。所有Built-in异常都继承自这个类。

捕获异常

使用 sys.exc_info 和 sys.last_traceback(包含的内容与 sys.exc_info() 相同,但它主要用于调试)可获取异常的详细信息,会返回一个3值元表(type, value, traceback) ,其中:

  • type:捕获到异常的类型名称;

  • value:捕获到异常的实例;

  • traceback:是一个包含stack traceback的对象;可通过traceback模块打印出来:

    • traceback.print_exc():直接打印当前异常信息;

    • traceback.print_tb(...):打印traceback对象信息;

    • traceback.print_exception(*sys.exc_info()):直接打印元素;

try:
    # ...
    raise
except ValueError as err:
    print("Value error: {0}".format(err))
except Exception:
    print(err)
    t,v,tb = sys.exc_info()
    traceback.print_tb(tb)
else: # except可以有多个,但else必须在最后
    # [...没有异常时]
finally:
    # [...总是执行]

# 一个except中捕获多个异常:
except (RuntimeError, TypeError, NameError):

抛出异常

可通过raise抛出build-in异常,也可自定义异常(要直接或间接继承自Exception):

class MyError(Exception):
    def __init__(self, value):
        self.value = value
    def __str__(self):
        return repr(self.value)

try:
    raise MyError(2*2)
except MyError as e:
    print('My exception occurred, value:', e.value)

预定义清理行为with

with语句用于保证任何情况下(包括抛出异常时)都能对当前进行访问的资源进行必要的清理工作。

对象要支持with需要满足上下文管理协议:

  • __enter__(self):语句体执行前调用执行,进入与此对象相关的运行时上下文;with语句将将此方法的返回值绑定到语句的AS子句中指定的目标(如果有设置的话);

  • __exit__(self, exc_type, exc_value, traceback):语句体执行完成,退出上下文时执行;

    • 参数描述导致上下文退出的异常。如果上下文运行时没有异常发生,那么三个参数都将置为None。

    • 如果有异常发生,并且该方法希望抑制异常(即阻止它被传播),则它应该返回True。否则,异常将在退出该方法时正常处理。

with context-expression [as target]:
    # with-body

文件访问完成后,总是保证文件被正确关闭了

with open(r'mytest') as tfile:
    for line in tfile:
        print(line)

一个简单示例:

class DummyResource:
    def __init__(self, tag):
        self.tag = tag
        print('Resource [%s]' % tag)
    def __enter__(self):
        print('[Enter %s]: Allocate resource.' % self.tag)
        return self   # 可以返回不同的对象
    def __exit__(self, exc_type, exc_value, exc_tb): #无异常时,后三个参数都为None
        if exc_tb is None:
            print('[Exit %s]: Exited without exception.' % self.tag)
            return True
        else:
            print('[Exit %s]: Exited with exception raised.' % self.tag)
            return False   # 可以省略,缺省的None也是被看做是False

with DummyResource("test") as dr:
    print(dr)   

@contextmanager

编写 __enter__ 和 __exit__ 仍然很繁琐,因此Python的标准库 contextlib 提供了更简单的写法:

from contextlib import contextmanager 
class Query(object): 
    def __init__(self, name):
        self.name = name 
    def query(self):
        print('Query info about %s...' % self.name)
 
@contextmanager
def create_query(name):
    print('Begin')
    q = Query(name)
    yield q
    print('End')

这个装饰器接受一个generator,用 yield 语句把 with ... as var 把变量输出出去,然后with 语句就可以正常的工作了:

with create_query('Bob') as q:
    q.query()

很多时候,我们希望在某段代码执行前后自动执行特定代码,也可以用 @contextmanager实现。

@contextmanager
def tag(name):
    print("<%s>" % name)
    yield
    print("</%s>" % name)
 
with tag("h1"):
    print("hello")
    print("world")

代码的执行顺序是:

  •  with 语句 首先执行 yield 之前的语句,因此打印出 <h1>.

  •  yield 调用会执行 with 语句内部的所有语句,因此打印出 hello 和 world.

  •  最后执行yield之后的语句,打印出 </h1>.

@closing

如果一个对象没有实现上下文,就不能使用 with 语句,但是可以用 closing() 来把对象变为上下文对象。

from contextlib import closing
from urllib.request import urlopen 
with closing(urlopen('https://www.python.org')) as page:
    for line in page:
        print(line)

closing 也是一个经过 @contextmanager 装饰的generator

@contextmanager
def closing(thing):
    try:
        yield thing
    finally:
        thing.close()

它的作用就是把任意对象变为上下文对象,并支持 with语句。

常见异常

- BaseException                     # 所有异常的父类

    - SystemExit                     # 由sys.exit()抛出的异常

    - KeyBoardInterrupt              # 通常由ctrl+c或者Delete抛出的异常

    - GeneratorExit                  # 当生成器被关闭时抛出的异常

    - Exception                      # 

        - StopIteration              # 迭代结束异常

        - StopAsyncIteration         # 由异步迭代的`__anext__()`抛出的异常

        - ArithmeticError            # 各种算数错误引起的异常

            - FloatingPointError     # 浮点数操作错误

            - OverflowError          # 结果超出范围

            - ZeroDivisionError      # 0为除数异常

    - AssertionError                 # assert错误异常

    - AttributeError                 # 属性引用异常

    - BufferError                    # 缓存错误

    - EOFError                       # 读不到数据

    - ImportError                    # import错误

        - ModuleNotFoundError        # 找不多模块

    - LookupError                    # 由索引和key值引起的异常

        - IndexError                 # 索引错误

        - KeyError                   # 字典key值错误

    - MemoryError                    # 内存溢出异常

    - NameError                      # 本地和全局找不到变量名

        - UnboundLocalError          # 局部变量没有赋值

    - OSError                        # system错误

        - BlockingIOError            # 调用阻塞异常错误

        - ChildProcessError          # 子进程

        - ConnectionError            # 连接

            - BrokenPipeError        # 管道读写异常

            - ConnectionAbortedError # 连接失败

            - ConnectionRefusedError # 连接拒绝

            - ConnectionResetError   # 连接重置

        - FileExistsError            # 创建文件和文件夹错误

        - FileNotFoundError          # 文件未找到

        - InterruptedError           # 中断错误

        - IsADirectoryError          # 文件操作用在文件夹上

        - NotADirectoryError         # 不是文件夹

        - PermissionError            # 权限

        - ProcessLookupError         # 进程不存在

        - TimeoutError               # 超时

    - ReferenceError                 # 引用异常

    - RuntimeError                   # 

        - NotImplementedError        # 运行抽象方法

        - RecursionError             # 超出最大递归深度

    - SyntaxError                    # 语法错误

        - IndentationError           # 缩进错误

            - TabError               # tab错误

    - SystemError                    # 解释器中断

    - TypeError                      # 类型错误

    - ValueError                     # 赋值错误

        - UnicodeError               # 

            - UnicodeEncodeError     # unicode编码错误

            - UnicodeDecodeError     # unicode解码错误

            - UnicodeTranslateError  # unicode转换错误

    - Warning                        # 

        - DeprecationWarning         # 操作不赞成警告

        - PendingDeprecationWarning  # 表明此操作将来会被弃用

        - UserWarning                # 用于用户生成警告

        - SyntaxWarning              # 语法可疑警告

        - RuntimeWarning             # 运行警告

        - FutureWarning              # 将会改变警告

        - ImportWarning              # 导入警告

        - UnicodeWarning             # unicode相关警告

        - BytesWarning               # 字节相关警告

        - ResourceWarning            # 资源使用情况警告

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python异常捕获与抛出以及With语句简介 的相关文章

  • phpExcel的使用方法以及导入导出实例【转载】

    一 下载PHPExcel 下载地址 xff1a https github com PHPOffice PHPExcel 二 读取Excel文件内容插入数据库 lt php require once 39 Classes PHPExcel p
  • 关于git 、初识git (fatal: Not a valid object name: 'master'.)

    主要错误原因是因为没有master分支 必须要commit一次 才可以有master分支 才可以创建别的分支 具体步骤 1 打开命令行 git add index html 2 git commit m 34 this is a test
  • 关于git的使用

    查看https blog csdn net qq 42072311 article details 80696886 https blog csdn net kevindgk article details 51606925 查看这两个博客
  • php使用upload封装类上传文件

    原文https blog csdn net navioo article details 51777799
  • phpStorm2018安装与破解(免安装打包版)

    首先将我为大家事先准备好的打包文件拷贝至软件安装盘 xff0c 本人安装于D盘 xff0c 所以这里已本人安装破解的过程进行讲述 1 gt phpStorm2018 2 2下载请转至链接 https pan baidu com s 1Kno
  • 最简洁的麦克纳姆轮原理与控制方法

    最简洁的麦克纳姆轮控制原理与控制方法 0 写在前面 对于第一次接触麦轮的小伙伴们肯定是没办法十分清晰地想象出麦轮底盘的各种运动该如何控制的 而在实际使用中 xff0c 麦轮的运动灵活性与控制难度之比又非常高 xff0c 可以说是在比较平整的
  • Nuttx下移植uorb笔记

    Nuttx下移植uorb笔记 之前接触过ros下的消息机制 xff08 生产者 消费者 xff09 模型 xff0c 第一感觉是灵活好用 xff0c 但是在资源有限的嵌入式环境里面 xff0c 邮箱 消息 显得就有点不那么灵活 xff0c
  • 关于ADRC算法以及参数整定(调参)的一些心得体会

    关于ADRC算法以及参数整定 xff08 调参 xff09 的一些心得体会 ADRC xff0c 全称叫做Active Disturbance Rejection Control xff0c 中文名是自抗扰控制技术 这项控制算法是由中科院的
  • boa-0.94.13:CGI中文问题

    为什么中文乱码 用win7 自带的浏览器ie 打开服务器的cgi form html xff0c 在Name 输入框输入 汉字 两个字 xff0c 提交服务器 如图1 图1 返回的是结果为 xff1a Server Got you para
  • 跑通VINS-Fusion全流程

    跑通VINS Fusion全流程 常规安装步骤详见官方1 ROS安装2 ceres solver安装3 VINS Fusion安装4 KITTI数据集下载5 跑通KITTI数据集 常规安装步骤详见官方 https github com HK
  • 带GPS的SLAM数据集汇总

    1 带GPS的相关SLAM数据集 Kitti 部分带部分不带 xff0c 看网站写的很详细 xff0c 数据集很常用 http www cvlibs net datasets kitti eval odometry php CMU Visu
  • 跑通GVINS——港科大新作

    跑通GVINS 港科大新作 0 简介1 环境2 跑通GVINS3 数据集4 相关资料打包下载 xff08 不包括数据集 xff09 6 泡泡机器人解读 港科大又一力作 xff01 vins mono以及vins fusion升级版GVINS
  • GVINS文章暴力翻译(仅供自学)

    GVINS文章暴力翻译 xff08 仅供自学 xff09 摘要1 介绍2 相关工作3 符号和定义A 框架b 状态 4 GNSS基本介绍A GNSS 概述B 伪距测量C 多普勒测量D SPP算法 5 系统概述6 概率公式A 地图估计B 惯性因
  • Vins-fusion用到的kitti数据集轨迹对不齐,使用evo -a转换

    kitti数据集基准问题 下面两个图一个是转换前 xff0c 一个是evo a 转换后的 问题描述 xff1a 现在遇到的问题是groundtruth和估计的位姿没有在一个坐标系中 xff0c 生成的轨迹对不齐 xff0c 需要首先根据位姿
  • 怎样用美图秀秀制作一寸照片

    有些时候 xff0c 老是会埋怨自己的http jingyan baidu com article 73c3ce28c852b7e50243d945 html证件照很难看 xff0c 自己拍的照片又不合格 xff0c 该怎么办呢 这里和大家
  • Realsense D435i关闭IR结构光

    Realsense D435i 关闭IR光 前言环境一次性关闭IR光从源码修改 前言 由于要做Realsense D435i的双目结构光相机标定 xff0c 其中用到了ROS来录制数据包 xff0c 但是结构光会影响标定 xff0c 所以得
  • vins-mono保存、重载地图、evo工具测试

    vins mono保存 重载地图 evo工具测试 地图保存与加载先跑起来修改地图保存的路径保存地图重载地图 evo测评evo工具修改数据格式使用evo绘制轨迹与双目ORB SLAM2进行对比 下面咱们来对vins mono地图进行简单测试
  • C++11新特性简介

    目录 功能扩展与增强 右值概念 类中右值扩展 标准库中右值扩展 内联命名空间 初始化 initialzier list 原始字符串 自定义字面值 类型自动推导 auto decltype 常量表达式函数constexpr 变长模板 空指针n
  • Realsense D435i单目跑ORB_SLAM2(无ROS版)

    主要参考mono euroc这个文件修改 xff0c 把数据源改成realsense的就可以了 如何获取realsense数据 xff0c 在之前的博客也阐述过 Realsense D435i 43 Opencv 获取彩色 深度 IMU数据
  • QGC开发 显示双GPS/RTK信息以及自定义页面(ubuntu)

    一 QGC开发 显示双GPS RTK信息 1 在sitl中进行仿真 xff0c 虚拟出第二个GPS mavlink发送到地面站 如下图中 xff0c 在mavlink msg gps2 raw h中找到发送第二组gps rtk数据函数mav

随机推荐

  • 03_FreeRTOS 二进制信号量

    03 FreeRTOS 二进制信号量 本文介绍 xff1a 二进制信号量的使用方法 简介信号量 信号量基本上用于将任务与系统中的其他事件同步 在FreeRTOS中 xff0c 信号量是基于队列机制实现的 FreeRTOS中有4种信号量 xf
  • 【首发】 ubuntu20.04安装matlab2021b/matlab2020b

    文章目录 一 下载地址1 1 2021b下载链接 BT 1 2 2021a下载链接1 3 2020b CSDN下载链接 二 MATLAB2021b安装方法2 1 Mount iso文件2 2 通过 install 启动安装程序2 3 输入正
  • 无人机右手定则以及角度大小方向粗判断

    无人机右手定则 xff1a 左力右场 xff0c 知道z轴方向 xff0c 然后就知道了xy轴方向 xff0c 其中x轴为大拇指指向的方向 四旋翼无人机欧拉角角度大小与其状态的关系 xff1a 设大地坐标系为 xff1a E xff08 O
  • NuttX RTOS

    目录 综述 NuttX是什么 看看这些文件和功能 它怎么会是一个小小的操作系统呢 xff1f NuttX讨论组 你想谈谈NuttX的特性吗 xff1f 你需要帮助吗 xff1f 问题吗 错误吗 下载 我在哪里可以买到NuttX xff1f
  • Arducopter Yaw角分析

    Arducopter Yaw 现梳理一遍Poshold模式下的yaw的情况 xff1a 首先从 Copter fast loop gt update flight mode gt Copter ModePosHold run span cl
  • TortoiseGit

    TortoiseGit用法 ubuntu16 04 18 04部署gitlab服务器 xff1a https blog csdn net qq 28263253 article details 80469203 一 如何安装 xff1a 下
  • 如何生成gazebo仿真环境的二维地图真值

    在移动机器人仿真中 xff0c 二维地图真值可以用来评价slam建图结果 xff0c 也可以直接给路径规划算法提供输入 利用gazebo进行仿真时 xff0c 有很多方法都可以获取静态仿真环境的二维地图真值 xff0c 本文将对以下链接 x
  • gazebo仿真环境加载模型方式

    我们都知道 xff0c gazebo可以在自带的gui中创建模型 导入模型 xff0c 然后将一批模型组成的仿真环境保存为一个world文件 xff1a 例如上图所示的场景 xff0c 我们可以从模型库中导入一些模型 xff0c 然后或直接
  • libCurl实现HTTP请求

    目录 接口说明使用步骤setopt函数部分选项说明 示例写数据回调GET请求POST请求 libCurl是一个多协议 跨平台的客户端URL传输库 xff1b 使用libCurl可方便地进行HTTP请求 接口说明 libCurl提供easy
  • EKF SLAM学习笔记03

    3 EKF SLAM 在上一节中我们看到的是扩展卡尔曼滤波在定位中的应用 xff0c EKF同样可以应用于SLAM问题中 在定位问题中 xff0c 机器人接收到的观测值是其在二维空间中的x y位置 如果机器人接收到的是跟周围环境有关的信息
  • AirSim仿真IMU内参分析

    目录 IMU简介IMU随机误差a 高斯白噪声 xff1a b 零偏不稳定性 xff08 bias instability xff09 xff1a 如何获得IMU随机误差参数随机误差参数的离散化 AirSim中的IMU噪声参数IMU噪声参数在
  • Gazebo仿真加速的几种思路

    以下是一些关于如何加速gazebo仿真的话题 gazebo仿真提速 xff1a xff08 无gpu加速 xff09 论坛上的相关帖子 xff1a How can I speed up simulation in Gazebo 在不考虑用g
  • PNG平面图转gazebo world文件的程序

    1 代码来源 xff1a GitHub 20chase menge gazebo generator menge是进行人群动态模拟的仿真程序 xff0c 可以使用以上链接的文件生成外壳从png图片生成相应的gazebo world 2 使用
  • AirSim使用--vslam

    声明 xff1a 本文写于2020年7月 xff0c 只对当时的代码版本有效 0 下载zip 001 zip 002 zip 003等分卷文件时 xff0c 可以使用 xff1a ubuntu 如何解压 zip 001 zip 002 zi
  • Ubuntu 16.04 Kalibr安装使用

    1 安装前置时 xff0c python igraph失败 xff0c 已解决 根据以下链接 xff1a https github com ethz asl kalibr issues 82 安装python igraph Ok I sol
  • 正点原子MP157系统移植和根文件系统构建视频教程之uboot命令学习笔记

    本篇内容主要来自正点原子手册 正点原子 STM32MP1嵌入式Linux驱动开发指南V2 0 pdf 10 3 U Boot 命令使用 xff0c 视频是第6 1讲到第6 6讲 目录 1 下载第三方库 2 基础命令 2 1 修改环境命令 2
  • 岁月划过生命线(我的2013-大二.上)

    岁月划过生命线 大二 上 又一次大清早被红马甲查赶出被窝 xff0c 让哥光着屁股就跑到隔壁宿舍去了 xff0c 真心恨死他们 这是一篇最早写于 2013 11 26 日的日志 xff0c 通过后来不断地增删改 xff0c 来总结 xff0
  • MySQL学习笔记_9_MySQL高级操作(上)

    MySQL 高级操作 xff08 上 xff09 一 MySQL 表复制 create table t2 like t1 复制表结构 xff0c t2 可以学习到 t1 所有的表结构 insert into t2 select from t
  • MySQL学习笔记_10_MySQL高级操作(下)

    MySQL 高级操作 xff08 下 xff09 五 MySQL 预处理语句 1 设置预处理 stmt xff0c 传递一个数据作为 where 的判断条件 prepare stmt from select from table name
  • Python异常捕获与抛出以及With语句简介

    目录 捕获异常 抛出异常 预定义清理行为with 64 contextmanager 64 closing 常见异常 Python3使用try except else 来捕获异常 xff0c 且要求异常必须继承Exception 类 所有B