python中,try-except捕获异常的意义(通过ai智库学习)

python中,不但可以用try-except捕获异常,
还可以自定义异常提示字符串,更可以自定义捕获异常后的处置。


(笔记模板由python脚本于2024年10月03日 06:47:06创建,本篇笔记适合喜欢研究python的coder翻阅)


【学习的细节是欢悦的历程】

  • Python 官网:https://www.python.org/

  • Free:大咖免费“圣经”教程《 python 完全自学教程》,不仅仅是基础那么简单……
    地址:https://lqpybook.readthedocs.io/


  自学并不是什么神秘的东西,一个人一辈子自学的时间总是比在学校学习的时间长,没有老师的时候总是比有老师的时候多。
            —— 华罗庚


  • My CSDN主页、My HOT博、My Python 学习个人备忘录
  • 好文力荐、 老齐教室
等风来,不如追风去……


自定义异常提示
try-except捕获
(自定义捕获异常后的处置)


本文质量分:

97 97 97

本文地址: https://blog.csdn.net/m0_57158496/article/details/142686616

CSDN质量分查询入口:http://www.csdn.net/qc


目 录

  • ◆ try-except捕获
    • 1、“异常捕获”VS“非捕获异常”
    • 2、选择打印“异常堆栈信息”
    • 3、可以“自定义”
    • 4、“自定义”的积极意义
    • 5、总结


◆ try-except捕获


1、“异常捕获”VS“非捕获异常”


我问:
python 中,try-except捕获异常正常返回结束程序和程序抛出异常而结束,除了在表现形式不一样,还有哪里不同?


ai回复:
在Python中,使用try-except结构捕获异常并正常返回结束程序与程序抛出异常而结束,除了表现形式上的不同,还存在以下几方面的区别:

  1. 控制流

    • 当异常被捕获并处理后,程序可以继续执行try-except块之后的代码。
    • 当异常未被捕获并向上抛出,程序的控制流会立即转移到最近的except块,如果没有找到匹配的except块,程序会终止,并且通常会打印出错误信息和堆栈跟踪。
  2. 错误处理

    • 捕获异常并处理后,可以执行特定的错误恢复流程,比如清理资源、记录错误信息、尝试其他操作等。
    • 抛出异常通常意味着程序无法从错误中恢复,需要停止当前操作并通知调用者或用户错误的发生。
  3. 异常传递

    • 在捕获异常后,可以选择不重新抛出异常,这会阻止异常继续向上传递。
    • 如果选择重新抛出异常(使用raise语句),或者没有捕获到异常,异常会继续传递,可能会被更高层次的try-except块捕获,或者导致程序终止。
  4. 堆栈跟踪

    • 当异常被捕获并处理后,通常不会显示堆栈跟踪,除非在处理代码中明确打印出来。
    • 如果异常没有被捕获,Python会打印出堆栈跟踪,这对于调试非常有用,因为它显示了异常发生的位置和调用序列。
  5. 资源管理

    • 在try块中,通常会在finally子句中放置清理代码,无论是否发生异常,这些代码都会执行。
    • 如果异常没有被捕获,那么只有在异常发生之前已经分配的资源会被清理,而try块中后续的资源管理代码将不会执行。
  6. 性能影响

    • 捕获并处理异常可能会带来一定的性能开销,尤其是在频繁发生异常的情况下。
    • 抛出异常通常会有更大的性能影响,因为它涉及到堆栈跟踪的生成和异常对象的传递。
  7. 代码意图

    • 捕获异常并处理通常表明开发者已经预见到可能出现的问题,并设计了解决方案。
    • 抛出异常可能表明开发者认为当前上下文无法处理该问题,需要更高级别的调用者来处理。

总结来说,捕获异常与抛出异常在控制流、错误处理、资源管理、性能和代码意图等方面都有所不同。开发者需要根据具体情况选择最合适的异常处理策略。



回页目录


2、选择打印“异常堆栈信息”


我问:
选择是否打印异常堆栈信息,如何取舍?


ai回复:
选择是否打印异常堆栈信息通常取决于以下因素:

  1. 调试和开发阶段

    • 在开发和测试阶段,打印异常堆栈信息通常是非常有用的。它可以帮助开发者快速定位问题所在,理解异常是如何触发的,以及异常的传播路径。
    • 建议:在开发环境中,可以打印完整的堆栈信息。
  2. 生产环境

    • 在生产环境中,堆栈信息可能包含敏感信息,如文件路径、变量名等,因此需要谨慎处理。
    • 对于非关键异常,可以仅记录异常的类型和描述,而不打印堆栈信息。
    • 对于关键异常,可以记录堆栈信息,但需要确保日志存储安全,并且不会被未经授权的人员访问。
  3. 异常的严重性

    • 对于那些可能导致程序崩溃或数据丢失的严重异常,通常需要记录详细的堆栈信息,以便于事后分析。
    • 对于非严重异常,如用户输入错误,可能只需要记录简短的错误信息。
  4. 用户友好性

    • 对于最终用户,显示技术性的堆栈信息通常没有帮助,甚至可能引起用户的困惑。在这种情况下,应该提供用户友好的错误消息。
    • 建议:向用户显示通用的错误信息,而不是堆栈信息。
  5. 日志级别

    • 可以根据日志级别来决定是否打印堆栈信息。例如,对于ERROR或CRITICAL级别的日志,可以打印堆栈信息;而对于WARNING或INFO级别的日志,则可能不需要。

以下是一些具体做法:

  • 使用日志库:使用Python的logging库来记录异常,可以设置不同的日志级别,并配置日志格式来决定是否包含堆栈信息。
  • 条件性打印:根据环境变量或配置文件中的设置来决定是否打印堆栈信息。
  • 封装异常处理:创建一个函数或类来封装异常处理逻辑,这样可以在一个地方控制堆栈信息的打印。
  • 信息脱敏:在记录堆栈信息之前,可以对其进行处理,移除或替换掉敏感信息。

以下是一个简单的示例,展示了如何根据环境设置来决定是否打印堆栈信息:

import logging
import os# 设置日志配置
logging.basicConfig(level=logging.INFO)def handle_exception(exc_type, exc_value, exc_traceback):if os.getenv('DEBUG', 'False').lower() == 'true':# 在调试模式下打印堆栈信息logging.error("Uncaught exception", exc_info=(exc_type, exc_value, exc_traceback))else:# 在生产模式下只打印异常信息logging.error(f"Uncaught exception: {exc_value}")# 注册异常处理函数
import sys
sys.excepthook = handle_exception# 示例:触发一个异常
try:1 / 0
except Exception as e:logging.error("An error occurred", exc_info=True)

在这个例子中,如果环境变量DEBUG设置为true,则会打印堆栈信息;否则,只会记录异常的描述。



回页目录


3、可以“自定义”


  • 我问:
    也就是说,trt-except可以“自定义”捕获异常而得到的提示字符串的处理方式。可以输出打印到终端;也可默默地记录到日志文件而继续代码的执行。
    我的理解,是不是正确?

ai回复:
是的,您的理解是正确的。使用try-except块确实可以“自定义”捕获异常后的处理方式,这包括但不限于以下几种情况:

  1. 打印到终端:可以在except块中添加一个print语句,将异常信息输出到终端。这对于调试非常有用,可以让开发者快速看到发生了什么错误。

try:# 可能会引发异常的代码pass
except Exception as e:print(f"捕获到异常:{e}")
  1. 记录到日志文件:可以将异常信息写入日志文件,而不会干扰程序的正常执行。这通常通过日志库(如Python的logging模块)来实现。

import logginglogging.basicConfig(filename='app.log', level=logging.ERROR)try:# 可能会引发异常的代码pass
except Exception as e:logging.error(f"捕获到异常:{e}")
  1. 继续代码执行:即使在捕获到异常后,也可以通过在except块中不使用returnraisesys.exit()等退出代码执行的语句,来允许程序继续运行。

try:# 可能会引发异常的代码pass
except Exception as e:# 处理异常,但允许程序继续执行logging.error(f"捕获到异常:{e}")# 可以选择是否重新抛出异常或采取其他措施
  1. 修改异常信息:在捕获异常后,可以重新定义异常信息,并选择重新抛出异常或以不同的方式处理它。

try:# 可能会引发异常的代码pass
except ZeroDivisionError:raise ValueError(f"不能除以零:{original_exception}") from original_exception
  1. 执行清理工作try-except块还可以用来执行必要的清理工作,比如关闭文件或释放资源,即使在发生异常的情况下也能保证资源得到妥善处理。

通过这种方式try-except不仅提供了错误处理的能力,还允许开发者以多种方式响应异常,从而增强程序的健壮性和灵活性。



回页目录


4、“自定义”的积极意义


我问:
raise 错误类型(tip)语句重定义异常提示字符串的积极意义?
raise ValueError(f"\n{' 零除错误!': -^37}")


ai回复:
使用 raise 语句重定义异常提示字符串的积极意义可以从以下几个方面理解:

  1. 错误信息的明确性

    • 通过自定义异常信息,可以提供关于错误原因的详细信息,这有助于开发者快速理解发生了什么问题。在您给出的例子中,' 零除错误!' 清楚地指出了错误类型。
  2. 用户界面的友好性

    • 如果错误信息会展示给最终用户,一个格式化和描述性的错误消息可以减少用户的困惑,提供更好的用户体验。
  3. 日志的可读性

    • 格式化的错误消息在日志文件中更容易阅读和理解。在调试或审计时,这可以节省时间并减少误解。
  4. 问题的定位

    • 当异常被抛出时,包含具体信息的错误消息可以帮助开发者更快地定位到问题的源头。
  5. 代码的可维护性

    • 自定义异常消息可以作为代码文档的一部分,帮助未来的维护者理解代码可能的失败点。

针对您的具体例子


raise ValueError(f"\n{' 零除错误!': -^37}")`

以下是一些具体的积极意义:

  • 换行 (\n):在控制台输出或日志文件中,错误信息在新的一行显示,这样不会与前文混淆,便于区分。

  • 居中对齐 (-^37):错误信息在37个字符宽的区域内居中显示,两边用连字符填充,这使得错误信息更加突出,易于识别。

  • 视觉上的强调:通过居中和填充,错误信息在视觉上得到了强调,这对于快速识别问题尤为重要。

总的来说,自定义异常提示字符串使得异常处理更加高效和有用,它不仅有助于开发者调试程序,还能改善最终用户的体验。



回页目录


5、总结


总结

  最好不要让自己的代码裸奔,给她穿上try-except的甲衣,她才好无损在python的羽翼下欢乐舞蹈。



回页首


上一篇:  与我免费ai书童拆解《坚持》创作历程(插科打诨的海侃胡闹,调侃舒展《坚持》诗创的灵魂盛宴之旅)
下一篇: 



我的HOT博:

  本次共计收集 311 篇博文笔记信息,总阅读量43.82w。数据于2024年03月22日 00:50:22完成采集,用时6分2.71秒。阅读量不小于6.00k的有 7 7 7篇。

  • 001
    标题:让QQ群昵称色变的神奇代码
    (浏览阅读 5.9w )
    地址:https://blog.csdn.net/m0_57158496/article/details/122566500
    点赞:25 收藏:86 评论:17
    摘要:让QQ昵称色变的神奇代码。
    首发:2022-01-18 19:15:08
    最后编辑:2022-01-20 07:56:47

  • 002
    标题:Python列表(list)反序(降序)的7种实现方式
    (浏览阅读 1.1w )
    地址:https://blog.csdn.net/m0_57158496/article/details/128271700
    点赞:8 收藏:35 评论:8
    摘要:Python列表(list)反序(降序)的实现方式:原址反序,list.reverse()、list.sort();遍历,全数组遍历、1/2数组遍历;新生成列表,resersed()、sorted()、负步长切片[::-1]。
    首发:2022-12-11 23:54:15
    最后编辑:2023-03-20 18:13:55

  • 003
    标题:pandas 数据类型之 DataFrame
    (浏览阅读 9.7k )
    地址:https://blog.csdn.net/m0_57158496/article/details/124525814
    点赞:7 收藏:36 
    摘要:pandas 数据类型之 DataFrame_panda dataframe。
    首发:2022-05-01 13:20:17
    最后编辑:2022-05-08 08:46:13

  • 004
    标题:个人信息提取(字符串)
    (浏览阅读 8.2k )
    地址:https://blog.csdn.net/m0_57158496/article/details/124244618
    点赞:2 收藏:15 
    摘要:个人信息提取(字符串)_个人信息提取python。
    首发:2022-04-18 11:07:12
    最后编辑:2022-04-20 13:17:54

  • 005
    标题:Python字符串居中显示
    (浏览阅读 7.6k )
    地址:https://blog.csdn.net/m0_57158496/article/details/122163023
    评论:1

  • 006
    标题:罗马数字转换器|罗马数字生成器
    (浏览阅读 7.5k )
    地址:https://blog.csdn.net/m0_57158496/article/details/122592047
    摘要:罗马数字转换器|生成器。
    首发:2022-01-19 23:26:42
    最后编辑:2022-01-21 18:37:46

  • 007
    标题:回车符、换行符和回车换行符
    (浏览阅读 6.0k )
    地址:https://blog.csdn.net/m0_57158496/article/details/123109488
    点赞:2 收藏:3 
    摘要:回车符、换行符和回车换行符_命令行回车符。
    首发:2022-02-24 13:10:02
    最后编辑:2022-02-25 20:07:40


推荐条件 阅读量突破6.00k
(更多热博,请点击蓝色文字跳转翻阅)

  • 截屏图片
    在这里插入图片描述
      (此文涉及ChatPT,曾被csdn多次下架,前几日又因新发笔记被误杀而落马。躺“未过审”还不如回收站,回收站还不如永久不见。😪值此年底清扫,果断移除。留此截图,以识“曾经”。2023-12-31)



回页首


老齐漫画头像

精品文章:

  • 好文力荐:齐伟书稿 《python 完全自学教程》 Free连载(已完稿并集结成书,还有PDF版本百度网盘永久分享,点击跳转免费🆓下载。)
  • OPP三大特性:封装中的property
  • 通过内置对象理解python'
  • 正则表达式
  • python中“*”的作用
  • Python 完全自学手册
  • 海象运算符
  • Python中的 `!=`与`is not`不同
  • 学习编程的正确方法

来源:老齐教室


◆ Python 入门指南【Python 3.6.3】


好文力荐:

  • 全栈领域优质创作者——[寒佬](还是国内某高校学生)博文“非技术文—关于英语和如何正确的提问”,“英语”和“会提问”是编程学习的两大利器。
  • 【8大编程语言的适用领域】先别着急选语言学编程,先看它们能干嘛
  • 靠谱程序员的好习惯
  • 大佬帅地的优质好文“函数功能、结束条件、函数等价式”三大要素让您认清递归

CSDN实用技巧博文:

  • 8个好用到爆的Python实用技巧
  • python忽略警告
  • Python代码编写规范
  • Python的docstring规范(说明文档的规范写法)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/442522.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于SSM车位租赁系统【附源码】

基于SSM车位租赁系统 效果如下: 注册页面 首页展示 车位租赁订单展示 车位列表页面 公告信息管理页面 公告类型管理界面 研究背景 随着经济的持续增长和城市化进程的加速,土地资源变得日益紧缺,停车难问题已成为许多城市面临的共同挑战。随…

【JavaEE】——文件IO

阿华代码,不是逆风,就是我疯 你们的点赞收藏是我前进最大的动力!! 希望本文内容能够帮助到你!! 目录 一:认识文件 1:文件的概念 2:文件的结构 3:文件路径…

No package nodejs available.No package npm available.

安装nodejs时出现的报错 这个错误的原因是当前的 yum 源没有包含 Node.js 和 npm 的安装包。 解决方法 使用 NodeSource 仓库 curl -fsSL https://rpm.nodesource.com/setup_14.x | bash -运行 yum install 安装 Node.js 和 npm: yum install -y nodejs使用 E…

登录注册静态网页实现(HTML,CSS)

实现效果图 实现效果 使用HTML编写页面结构,CSS美化界面,点击注册,跳转到注册界面,均为静态网页,是课上的一个小作业~ 使用正则表达式对输入进行验证,包括邮箱格式验证,用户名格式验证。 正则…

YOLO 二元分类器

YOLO 二元分类器 在评估二元分类器性能时,TP、FP、TN和FN是四个核心指标,它们分别代表真阳性、假阳性、真阴性和假阴性。以下是这些指标的定义、计算方法以及在实际应用中的意义: 定义 TP(真阳性):模型正…

嵌入式 c 内存堆栈增长方向往低地址方向好处

如下是堆和栈内存空间使用方式有如下好处: 1、stack从高地址向低地址扩展,这样栈空间的起始位置就能确定下来;如果反向,则要考虑这个起点从哪里合适,要确定堆的大小。 2、可以共用中间部分区域空间,最大化…

kafka-windows集群部署

kafka-windows集群部署目录 文章目录 kafka-windows集群部署目录前言一、复制出来四个kafka文件夹二、修改集群每个kafka的配置文件四、启动zookeeper,kafka集群 前言 部署本文步骤可以先阅读这一篇博客,这篇是关于单机kafka部署测试的。本文用到的文件…

Linux驱动学习——内核编译

1、从官网下载适合板子的Linux内核版本 选择什么版本的内核需要根据所使用的硬件平台而定,最好使用硬件厂商推荐使用的版本 https://www.kernel.org/pub/linux/kernel/ 2、将压缩包复制到Ubuntu内进行解压 sudo tar -xvf linux-2.6.32.2-mini2440-20150709.tgz 然…

职场上的人情世故,你知多少?这五点一定要了解

职场是一个由人组成的复杂社交网络,人情世故在其中起着至关重要的作用。良好的人际关系可以帮助我们更好地融入团队,提升工作效率,甚至影响职业发展。在职场中,我们需要了解一些关键要素,以更好地处理人际关系&#xf…

前端练习小项目 —— 让图片变得更 “色”

前言:相信读者在学习完了HTML、CSS和JavaScript之后已经想要迫不及待的想找一个小型的项目来练练手,那么这篇文章就正好能满足你的 “需求”。 ✨✨✨这里是秋刀鱼不做梦的BLOG ✨✨✨想要了解更多内容可以访问我的主页秋刀鱼不做梦-CSDN博客 在开始学习…

详解JavaScript中函数式编程

函数式编程 JS并非函数式编程语言,但可以应用函数式编程技术,这种风格很多语言都用,例如Java. 使用函数处理数组 假设有一个数组,数组元素都是数字,我们想要计算这些元素的平均值和标准差。使用非函数式编程风格的话…

微信小程序python+uniapp毕业论文选题系统设计与实现 lj141

目录 项目介绍具体实现截图开发者工具介绍技术路线性能/安全/负载方面开发语言以及框架介绍python-flask核心代码部分展示python-django核心代码部分展示详细视频演示源码获取 项目介绍 考虑到实际生活中在毕业论文选题管理方面的需要以及对该系统认真的分析,将小程序权限按管…

LabVIEW回转支承间隙自动化检测系统

开发了一种基于LabVIEW软件的回转支承间隙检测系统,通过高精度传感器和数据采集卡,自动化、高效地测量回转支承的轴向间隙和径向间隙,提高了检测精度和生产质量。以下是对系统的详细描述与应用案例分析,希望能为有类似需求的开发者…

linux如何与网络时间对齐(雪花算法ID重复)

文章目录 前言一、可能引发什么问题?二、调整步骤1.查看当前系统时间2.修改为中国时区3.同步网络时间4. 雪花id重复 总结 前言 linux服务器是部署服务的不二之选,有个小问题不可忽略: 会发现默认的服务器时间并非中国时区,时间也是相差八小时,中国时区…

踩坑NVTX

最开始在 【简说】NVTX Nsight Nvidia性能分析利器 看到NVTX的时候,我觉得这是一个好东西啊,可以详细说明每一段时间对应的是哪一段程序。 看了一下github,他的文章已经过时,现在已经不需要链接动态库了,直接includ…

2024_10_8 系统进展

改进位置 发现是label_api里藏了我需要改进的东西 settings.py 数据库 我这边电脑上使用的是windows 192 vue.config.js 陈家强是这样设置的 module.exports {publicPath: process.env.NODE_ENV production? /: /,assetsDir: static,// css: {// extract: false// },…

问:LINUXWINDOWS线程CPU时间如何排序?

Linux 在Linux上,你可以使用ps命令结合sort命令来查看和排序进程或线程的CPU使用时间。 查看进程的CPU使用时间并按时间排序 使用ps命令的-o选项可以自定义输出格式,-e选项表示显示所有进程,--sort选项用于排序。 ps -e -o pid,tid,comm,…

使用YOLO11实例分割模型进行人物分割【附完整源码】

《博主简介》 小伙伴们好,我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源,可关注公-仲-hao:【阿旭算法与机器学习】,共同学习交流~ 👍感谢小伙伴们点赞、关注! 《------往期经典推…

D31【python 接口自动化学习】- python基础之输入输出与文件操作

day31 文件的打开 学习日期:20241008 学习目标:输入输出与文件操作﹣-43 常见常新:文件的打开 学习笔记: 文件的概念 使用open()函数打开文件 文件路径处理 文件打开模式 总结 文件操作包括:打开&#…

VM虚拟机安装 CentOS 7.6 部署宝塔面板实操

一、centos下载 进入centos官网下载页面,选择7.6版本,依次点击 tree-》isos-》x86_64/-》CentOS-7-x86_64-DVD-1810.iso 进行下载。 centos官网下载页面: https://wiki.centos.org/Download.html1、打开下载页面 二、配置CentOS 7的网络 1、…