当前位置: 首页 > news >正文

Python中的异常与错误处理

一、基础知识

1、一个try语句支持多个except子句,但请记得将更精确的异常类型放在前面。
2、try语句的else分支会在没有异常时执行,因此它可以用来替代标记变量(flag变量)。
3、不带任何参数的raise语句会直接重复抛出当前异常。
4、上下文管理器经常用来处理异常,它最常见的用途是替代finally子句。
5、上下文管理器可以用来忽略某段代码里的异常(不影响功能正常执行逻辑的异常)。
6、使用@contextmanager装饰器可以轻松定义上下文管理器。

二、错误处理与参数校验

1、当你可以选择编写条件判断或者异常捕获时,优先选用异常捕获(EAFP)

EAFP,Easier to Ask for Forgiveness than Permission,获取原谅比许可简单。
与之相对应的是LBYL,Look Before You Leap,三思而后行。
Python社区更偏爱基于异常捕获的EAFP风格,通俗点说,开发者们对待下雨——“吃感冒药”胜过“看看天气预报”。

2、不要让函数返回错误信息,直接抛出自定义异常吧。
3、手动校验数据合法性非常繁琐,尽量使用专业模块来做这件事(例如pydantic)。
4、不要使用assert来作为参数校验,请使用raise来替代它。
5、处理错误需要付出额外的成本,加入能够通过设计来避免就再好不过了。
6、在设计API时,需要慎重考虑是否真的有必要抛出错误。
7、使用“空对象模式”能免去一些针对边界情况的错误处理工作。

三、当捕获异常时

1、过于模糊和宽泛的异常捕获可能会让成语便于崩溃,但更有可能带来更大的麻烦。
2、异常捕获贵在精确,只捕获可能抛出异常的语句,值捕获可能的异常类型。
3、有时候,让程序提早崩溃未必是什么坏事。
4、完全忽略异常是风险非常高的行为,大多数情况下,请至少记录一条错误日志信息。

四、当抛出异常时

1、保证模块内抛出的异常与模块自身的抽象级别一致。
2、如果异常的抽象级别过高,把它替换为更低级的新异常。
3、如果异常的抽象级别过低,把它包装为更高级的新异常,然后重新抛出。
4、不要让调用方用字符串匹配来判断异常种类,尽量提供可区分的异常。

参考内容:《Python工匠——案例、技巧与工程实践》

http://www.lryc.cn/news/229794.html

相关文章:

  • sqli-labs关卡16(基于post提交的双引号加括号闭合的布尔盲注)通关思路
  • 2.5k的ChatGPT-Java版SDK升级1.1.2-beta0支持GPT-4V、Dall-e-3模型、ToolCalls、微调Job、TTS...
  • k8s二进制(ETCD的部署安装)
  • 【rl-agents代码学习】02——DQN算法
  • 关于使用 Java 反射技术来实现解耦?
  • 使用清华智谱ChatGLM2大模型搭建本地私有知识库
  • MES系统如何赋能制造企业实现4M防错追溯?
  • Mybatis保存时参数携带了逗号和空格导致SQL保存异常
  • vscode launch.json
  • 绿盟远程安全评估系统 RSAS 使用体验-难用
  • 【Linux】 mdir命令使用
  • 解压游戏资源,导出游戏模型
  • 【科研新手指南2】「NLP+网安」相关顶级会议期刊 投稿注意事项+会议等级+DDL+提交格式
  • 220kV环形网络的动态无功补偿方案初步设计
  • 关于值传递和引用传递的问题记录
  • 律师咨询小程序搭建流程
  • 怎么在uni-app中使用Vuex 深度解刨
  • 兼容iphone(ios)圆角(border-radius)不起作用的问题
  • 车间部署MES管理系统后有哪些变化
  • 19C进入数据库出现问号
  • Mistral 7B 比Llama 2更好的开源大模型 (一)
  • 【JUC】三、集合的线程安全
  • 使用 Redis 实现生成分布式全局唯一ID(使用SpringBoot环境实现)
  • Pytorch CUDA CPP简易教程,在Windows上操作
  • 服务器怎么连接
  • 线性代数-Python-05:矩阵的逆+LU分解
  • shell实用脚本命令
  • STM32——端口复用与重映射概述与配置(HAL库)
  • ABZ正交编码 - 异步电机常用的位置信息确定方式
  • Linux学习第41天:Linux SPI 驱动实验(二):乾坤大挪移