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 学习个人备忘录
- 好文力荐、 老齐教室
本文质量分:
本文地址: 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结构捕获异常并正常返回结束程序与程序抛出异常而结束,除了表现形式上的不同,还存在以下几方面的区别:
-
控制流:
- 当异常被捕获并处理后,程序可以继续执行try-except块之后的代码。
- 当异常未被捕获并向上抛出,程序的控制流会立即转移到最近的except块,如果没有找到匹配的except块,程序会终止,并且通常会打印出错误信息和堆栈跟踪。
-
错误处理:
- 捕获异常并处理后,可以执行特定的错误恢复流程,比如清理资源、记录错误信息、尝试其他操作等。
- 抛出异常通常意味着程序无法从错误中恢复,需要停止当前操作并通知调用者或用户错误的发生。
-
异常传递:
- 在捕获异常后,可以选择不重新抛出异常,这会阻止异常继续向上传递。
- 如果选择重新抛出异常(使用
raise
语句),或者没有捕获到异常,异常会继续传递,可能会被更高层次的try-except块捕获,或者导致程序终止。
-
堆栈跟踪:
- 当异常被捕获并处理后,通常不会显示堆栈跟踪,除非在处理代码中明确打印出来。
- 如果异常没有被捕获,Python会打印出堆栈跟踪,这对于调试非常有用,因为它显示了异常发生的位置和调用序列。
-
资源管理:
- 在try块中,通常会在finally子句中放置清理代码,无论是否发生异常,这些代码都会执行。
- 如果异常没有被捕获,那么只有在异常发生之前已经分配的资源会被清理,而try块中后续的资源管理代码将不会执行。
-
性能影响:
- 捕获并处理异常可能会带来一定的性能开销,尤其是在频繁发生异常的情况下。
- 抛出异常通常会有更大的性能影响,因为它涉及到堆栈跟踪的生成和异常对象的传递。
-
代码意图:
- 捕获异常并处理通常表明开发者已经预见到可能出现的问题,并设计了解决方案。
- 抛出异常可能表明开发者认为当前上下文无法处理该问题,需要更高级别的调用者来处理。
总结来说,捕获异常与抛出异常在控制流、错误处理、资源管理、性能和代码意图等方面都有所不同。开发者需要根据具体情况选择最合适的异常处理策略。
2、选择打印“异常堆栈信息”
我问:
选择是否打印异常堆栈信息,如何取舍?
ai回复:
选择是否打印异常堆栈信息通常取决于以下因素:
-
调试和开发阶段:
- 在开发和测试阶段,打印异常堆栈信息通常是非常有用的。它可以帮助开发者快速定位问题所在,理解异常是如何触发的,以及异常的传播路径。
- 建议:在开发环境中,可以打印完整的堆栈信息。
-
生产环境:
- 在生产环境中,堆栈信息可能包含敏感信息,如文件路径、变量名等,因此需要谨慎处理。
- 对于非关键异常,可以仅记录异常的类型和描述,而不打印堆栈信息。
- 对于关键异常,可以记录堆栈信息,但需要确保日志存储安全,并且不会被未经授权的人员访问。
-
异常的严重性:
- 对于那些可能导致程序崩溃或数据丢失的严重异常,通常需要记录详细的堆栈信息,以便于事后分析。
- 对于非严重异常,如用户输入错误,可能只需要记录简短的错误信息。
-
用户友好性:
- 对于最终用户,显示技术性的堆栈信息通常没有帮助,甚至可能引起用户的困惑。在这种情况下,应该提供用户友好的错误消息。
- 建议:向用户显示通用的错误信息,而不是堆栈信息。
-
日志级别:
- 可以根据日志级别来决定是否打印堆栈信息。例如,对于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
块确实可以“自定义”捕获异常后的处理方式,这包括但不限于以下几种情况:
- 打印到终端:可以在
except
块中添加一个print
语句,将异常信息输出到终端。这对于调试非常有用,可以让开发者快速看到发生了什么错误。
try:# 可能会引发异常的代码pass
except Exception as e:print(f"捕获到异常:{e}")
- 记录到日志文件:可以将异常信息写入日志文件,而不会干扰程序的正常执行。这通常通过日志库(如Python的
logging
模块)来实现。
import logginglogging.basicConfig(filename='app.log', level=logging.ERROR)try:# 可能会引发异常的代码pass
except Exception as e:logging.error(f"捕获到异常:{e}")
- 继续代码执行:即使在捕获到异常后,也可以通过在
except
块中不使用return
、raise
或sys.exit()
等退出代码执行的语句,来允许程序继续运行。
try:# 可能会引发异常的代码pass
except Exception as e:# 处理异常,但允许程序继续执行logging.error(f"捕获到异常:{e}")# 可以选择是否重新抛出异常或采取其他措施
- 修改异常信息:在捕获异常后,可以重新定义异常信息,并选择重新抛出异常或以不同的方式处理它。
try:# 可能会引发异常的代码pass
except ZeroDivisionError:raise ValueError(f"不能除以零:{original_exception}") from original_exception
- 执行清理工作:
try-except
块还可以用来执行必要的清理工作,比如关闭文件或释放资源,即使在发生异常的情况下也能保证资源得到妥善处理。
通过这种方式,try-except
不仅提供了错误处理的能力,还允许开发者以多种方式响应异常,从而增强程序的健壮性和灵活性。
4、“自定义”的积极意义
我问:
raise 错误类型(tip)语句重定义异常提示字符串的积极意义?
如raise ValueError(f"\n{' 零除错误!': -^37}")
ai回复:
使用 raise
语句重定义异常提示字符串的积极意义可以从以下几个方面理解:
-
错误信息的明确性:
- 通过自定义异常信息,可以提供关于错误原因的详细信息,这有助于开发者快速理解发生了什么问题。在您给出的例子中,
' 零除错误!'
清楚地指出了错误类型。
- 通过自定义异常信息,可以提供关于错误原因的详细信息,这有助于开发者快速理解发生了什么问题。在您给出的例子中,
-
用户界面的友好性:
- 如果错误信息会展示给最终用户,一个格式化和描述性的错误消息可以减少用户的困惑,提供更好的用户体验。
-
日志的可读性:
- 格式化的错误消息在日志文件中更容易阅读和理解。在调试或审计时,这可以节省时间并减少误解。
-
问题的定位:
- 当异常被抛出时,包含具体信息的错误消息可以帮助开发者更快地定位到问题的源头。
-
代码的可维护性:
- 自定义异常消息可以作为代码文档的一部分,帮助未来的维护者理解代码可能的失败点。
针对您的具体例子
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
截屏图片
(此文涉及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规范(说明文档的规范写法)