Python异常与错误处理详细讲解
作者:soapcmd 发布时间:2022-07-07 05:13:38
基础知识
优先使用异常捕获
LBYL(look before you leap): 在执行一个可能出错的操作时,先做一些关键的条件判断,仅当满足条件时才进行操作。
EAFP(eaiser to ask for forgiveness than permission): 不做事前检查,直接执行操作。
后者更优: 代码简洁,效率更高
try语句常用知识
把更精确的except语句放在前面
异常类派生关系: BaseException --> Exception --> LookupError --> KeyError
父类被捕获后子类就不会再被触发
使用else分支
try except else
else: 仅当try语句块里面没有抛出任何异常时,才执行else分支
和finally不同,假如在try语句块时碰到了return或者break, 中断了本次异常,那么即使代码没抛出任何异常,else分支内的逻辑也不会被执行
而finally里的语句,无论如何都会被执行,哪怕已经执行了return
使用空raise语句
>>> def incr_by_key(d, key):
... try:
... d[key] += 1
... except KeyError:
... print('here')
... raise
...
>>> d = {'a': 1}
>>> incr_by_key(d, 'b')
here
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 3, in incr_by_key
KeyError: 'b'
>>> d['c'] += 1
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'c'
当一个空raise语句出现在except块里时,它会原封不动地重新抛出当前异常
抛出异常,而不是返回错误
使用上下文管理器
__enter__
__exit__
>>> class DummyContext:
... def __init__(self, name):
... self.name = name
... def __enter__(self):
... return f"{self.name} -- something"
... def __exit__(self, exc_type, exc_val, exc_db):
... print("Exiting")
... return False
...
>>> with DummyContext('foo') as name:
... print(f'Name: {name}')
...
Name: foo -- something
Exiting
用于替代finally 语句清理资源
在__exit__
里面清理资源。
此外__exit__
也可以用来对异常进行二次处理然后抛出,或是忽略某种异常等等。
用户忽略异常
一般可以捕获异常后pass
但是也可以:
def __exit__(self, exc_type, exc_val, exc_db):
if exc_type == SomeException:
return True
return False
此外:使用contextlib里面的suppress也可以实现相同的功能
使用contextmanage装饰器
>>> @contextmanager
... def create_con_obj(host, port, timeout=None):
... conn = create_conn(host, port, timeout=timeout)
... try:
... yield conn
... finally:
... conn.close()
yield前面的语句会在进入管理器时执行(类似:__enter__
)
之后的逻辑会在退出管理器时执行(类似:__exit__
)
来源:https://blog.csdn.net/weixin_44596902/article/details/128270006


猜你喜欢
- 本文实例讲述了mysql 设置自动创建时间及修改时间的方法。分享给大家供大家参考,具体如下:第一种,通过ddl进行定义CREATE TABL
- 列表的结构在 cpython 实现的 python 虚拟机当中,下面就是 cpython 内部列表实现的源代码:typedef struct
- JavaScript封装弹框插件的具体代码,供大家参考,具体内容如下知识点1、document.querySelector() 方法quer
- 前言大家好,今天给大家带来绘制“手绘风格”可视化作品的小技巧,主要涉及Python编码绘制。主要内容
- 本文实例讲述了JS实现简单的二元方程计算器功能。分享给大家供大家参考,具体如下:<!DOCTYPE HTML PUBLIC "
- Python使用pandas导入xlsx格式的excel文件内容1. 基本导入在 Python中使用pandas导入.xlsx文件的方法是r
- 1. 基本使用remove() 函数可以删除列表中的指定元素语法list.remove( element )参数element:任意数据类型
- 用ASP实现搜索引擎的功能是一件很方便的事,可是,如何实现类似3721的智能搜索呢?比如,当在搜索条件框内输入“中国人民”时,自动从中提取“
- 元素的CSS样式,除了包括内联的(即通过style属性加上的)样式定义外,还有页面嵌入的css和外部引入的css两种方式。但在JS中通过el
- 如何制作一个倒计时的程序? 见下:<%CountdownDate = #1/1
- 1.折线图 plt.plot()常用的一些参数:颜色(color):‘c’ 青红(cyan)&
- 因为要批量用某软件处理一批eps文件,所以要模拟鼠标及键盘动作,使其能够自动化操作。#-*-coding:utf-8-*-import os
- 保证只能运行一个脚本实例,方法是程序运行时监听一个特定端口,如果失败则说明已经有实例在跑。使用装饰器实现,便于重用import functo
- finetune分为全局finetune和局部finetune。首先介绍一下局部finetune步骤:1.固定参数 for na
- 钉钉SDK对接sdk还是遇到不少问题的钉钉python版SDK文档地址:https://dingtalk-sdk.readthe
- 三种解决方法: 1、改表法。可能是你的帐号不允许从远程登陆,只能在localhost。这个时候只要在localhost的那台电脑,登入mys
- 项目需求:将kafka解析来的日志获取到数据库的变更记录,按照订单的级别和订单明细级别写入数据库,一条订单的所有信息包括各种维度信息均保存在
- 数据集数据集为Barcelona某段时间内的气象数据,其中包括温度、湿度以及风速等。本文将简单搭建来对风速进行预测。特征构造对于风速的预测,
- Python 通过pywin32模块调用WindowsAPI接口,实现对特定进程加载模块的枚举输出并检测该PE程序模块所启用的保护方式,此处
- 本文实例讲述了Python编程实现正则删除命令功能。分享给大家供大家参考,具体如下:脚本用途:在DOS下使用del功能箭头,不支持正则表达式