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

标签:Python,异常,错误处理
0
投稿

猜你喜欢

  • asp如何创建目录?

    2009-11-14 20:51:00
  • Python中利用sqrt()方法进行平方根计算的教程

    2022-09-17 13:11:25
  • python虚拟环境virtualenv的使用教程

    2021-03-08 00:50:17
  • Python第三方库face_recognition在windows上的安装过程

    2023-07-27 02:51:29
  • ASP技巧 挂QQ的网页源代码ASP/PHP

    2009-01-05 12:36:00
  • sqlserver2008查看表记录或者修改存储过程出现目录名无效错误解决方法

    2024-01-28 21:15:02
  • php+mysqli实现批量替换数据库表前缀的方法

    2023-11-22 10:15:55
  • C#连接mariadb(MYSQL分支)代码示例分享

    2024-01-14 01:09:33
  • python实现文字版扫雷

    2023-01-01 13:01:47
  • Mysql 5.7.19 免安装版遇到的坑(收藏)

    2024-01-19 12:18:39
  • 简述 Python 的类和对象

    2023-05-17 12:44:23
  • 深入string理解Golang是怎样实现的

    2024-02-07 06:45:24
  • Django基于ORM操作数据库的方法详解

    2024-01-28 18:53:52
  • Python爬虫headers处理及网络超时问题解决方案

    2022-11-19 23:38:34
  • 聊聊Python代码中if __name__ == ‘__main__‘的作用是什么

    2022-05-10 18:06:44
  • python采集博客中上传的QQ截图文件

    2021-03-03 16:45:25
  • 利用Python操作MongoDB数据库的详细指南

    2024-01-16 13:49:28
  • 在pytorch 中计算精度、回归率、F1 score等指标的实例

    2022-08-10 06:28:18
  • MySQL 查询的排序、分页相关

    2024-01-19 18:26:59
  • 推荐一款高效的python数据框处理工具Sidetable

    2022-07-22 04:34:25
  • asp之家 网络编程 m.aspxhome.com