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

news2024/10/5 22:51:13

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 logging

logging.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.coloradmin.cn/o/2190667.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

交叠型双重差分法

交叠型双重差分法(Staggered Difference-in-Differences, Staggered DiD)是一种扩展的双重差分(Difference-in-Differences, DiD)方法,用于处理多个时间点的政策干预或处理组(treatment group)并…

每日读则推(四)

Whats this...? | An invitation letter n.邀请函 n.邀请(invite v.邀请) Can a tool grasp the meaning in a song? v. 握紧,理解 n.紧握,理解(力) Can it feel the melody, where emotions belong? …

C++ union的运用

// // Created by 徐昌真 on 2024/10/5. // #include <iostream> #include <cstring> using namespace std;//定义一个结构体(类) struct Info{char _name[20];int _role; //老师是0 同学是1union { //用union存放score和course 节省内存int score;char course[2…

全球十大独角兽(完整榜单),你猜中国占几席?

全球十大独角兽 10月3日&#xff0c;OpenAI 宣布已完成 66 亿美元融资&#xff0c;估值达 1570 亿美元&#xff0c;成为全球第三的独角兽。 给新来的读者重温一下"独角兽"的定义&#xff1a;估值超过10亿美元的未上市企业。 你可能会好奇&#xff0c;OpenAI 是第三&a…

Linux·进程概念(下)

1. 进程优先级 优先级就是获得某种资源的先后顺序&#xff0c;因为CPU资源是有限的&#xff0c;因此各个进程之间要去争取CPU的资源。 那么针对Linux操作系统下的PCB中&#xff0c;也就是task_struct结构体中&#xff0c;使用了int类型的变量记录了每个进程的优先级属性&#x…

WIFI网速不够是不是光猫的“路由模式”和“桥接模式”配置错了?

光猫&#xff08;光纤调制解调器&#xff09;是一种用于将光纤信号转换为数字信号的设备&#xff0c;通常用于家庭或企业网络中。光猫可以在不同的工作模式下运行&#xff0c;其中最常见的两种模式是“路由模式”和“桥接模式”。以下是这两种模式的详细解释及其优缺点。 一、路…

python实现单例模式的常用三种方法-基于__new__/使用装饰器以及Python中的值类型、引用类型以及类的静态变量、读取进程和线程ID

一、python实现单例模式的常用三种方法-基于__new__,使用装饰器 涉及到类的使用就会有类的实例化&#xff0c;就会有类单例实现的需求&#xff0c;因为重复实例化会浪费资源。python中的单例模式与别的语言相比&#xff0c;单例实现的方法更丰富。虽然python实现单例的模式的方…

MobaXterm使用

Linux连接工具MobaXterm详细使用教程-CSDN博客

Elasticsearch学习笔记(五)Elastic stack安全配置二

一、手动配置http层SSL 通过前面的配置&#xff0c;我们为集群传输层手动配置了TLS&#xff0c;集群内部节点之间的通信使用手动配置的证书进行加密&#xff0c;但是集群与外部客户端的http层目前还是使用的自动配置&#xff0c;集群中HTTP的通信目前仍然使用自动生成的证书ht…

【韩顺平Java笔记】第7章:面向对象编程(基础部分)【227-261】

文章目录 227. 重载介绍228. 重载快速入门229. 重载使用细节230. 重载课堂练习1231. 232. 重载课堂练习2,3233. 可变参数使用233.1 基本概念233.2 基本语法233.3 快速入门案例 234. 可变参数细节235. 可变参数练习236. 作用域基本使用237. 作用域使用细节1238. 作用域使用细节2…

Docker安装部署和常用命令

Docker 是一种开源的平台&#xff0c;旨在帮助开发者和运维人员更轻松地创建、部署和运行应用程序。通过将应用程序及其依赖项打包到一个名为容器的标准化单位中&#xff0c;Docker 提供了一种轻量级的虚拟化解决方案。与传统虚拟机相比&#xff0c;Docker 容器可以在同一主机上…

GoogleNet原理与实战

在2014年的ImageNet图像识别挑战赛中&#xff0c;一个名叫GoogLeNet 的网络架构大放异彩。以前流行的网络使用小到11&#xff0c;大到77的卷积核。本文的一个观点是&#xff0c;有时使用不同大小的卷积核组合是有利的。 回到他那个图里面你会发现,这里的一个通过我们最大的池化…

12条职场经验总结

01 事干得好不好尚且不说&#xff0c;但是话一定要说得漂亮。 比如&#xff0c;当领导给你安排工作的时候&#xff0c;你一定要非常积极地响应&#xff0c;拍着胸脯跟领导说“放心吧”。至于后续到底怎么干&#xff0c;再结合实际情况有的放矢地把握。 02 当别人夸奖你的时…

记录使用crypto-js、jsencrypt实现js加密的方法

实用为主&#xff0c;直接上干货。 使用工具&#xff1a;pycharm专业版2020.3.2。 记录通过crypto-js模块、jsencrypt模块两种方式实现加密。 本文在pycharm中新建一个项目&#xff0c;一步一步记录实现步骤。 一、新建pycharm项目并新建两个js文件&#xff0c;分别命名为c…

Python 工具库每日推荐 【Requests】

文章目录 引言Python网络库的重要性今日推荐:Requests工具库主要功能:使用场景:安装与配置快速上手示例代码代码解释实际应用案例案例1:获取天气信息案例分析案例2:文件上传案例分析高级特性会话和Cookie处理自定义请求头超时设置代理设置扩展阅读与资源优缺点分析优点:缺…

Markdown 语法详解大全(超级版)(三)——甘特图语法详解

Markdown 语法详解大全(超级版)&#xff08;三&#xff09;——甘特图语法详解 Markdown 语法详解大全(超级版)&#xff08;一&#xff09; Markdown 语法详解大全(超级版)&#xff08;二&#xff09; Markdown 语法详解大全(超级版)&#xff08;三&#xff09; Markdown 语法…

[Linux#61][UDP] port | netstat | udp缓冲区 | stm32

目录 0. 预备知识 1. 端口号的划分范围 2. 认识知名端口号 3. netstat 命令 4. pidof 命令 二.UDP 0.协议的学习思路 1. UDP 协议报文格式 报头与端口映射&#xff1a; 2. UDP 的特点 面向数据报&#xff1a; 3. UDP 的缓冲区 4. UDP 使用注意事项 5. 基于 UDP 的…

栈的介绍与实现

一. 概念与结构 栈&#xff1a;⼀种特殊的线性表&#xff0c;其只允许在固定的⼀端进⾏插⼊和删除元素操作。进⾏数据插⼊和删除操作的⼀端称为栈顶&#xff0c;另⼀端称为栈底。栈中的数据元素遵守后进先出LIFO&#xff08;Last In First Out的原则。 压栈&#xff1a;栈的插…

平面电磁波(解麦克斯韦方程)电场相位是复数的积分常数,电场矢量每个分量都有一个相位。磁场相位和电场一样,这是因为无损介质中实数的波阻抗

注意无源代表你立方程那个点xyzt处没有源&#xff0c;电场磁场也是这个点的。 j电流面密度&#xff0c;电流除以单位面积&#xff0c;ρ电荷体密度&#xff0c;电荷除以单位体积。 j方程组有16个未知数&#xff0c;每个矢量有三个xyz分量&#xff0c;即三个未知数&#xff0c;…

k8s的简介和部署

一、k8s简介 在部署应用程序的方式上面&#xff0c;主要经历了三个阶段&#xff1a; 传统部署:互联网早期&#xff0c;会直接将应用程序部署在物理机上优点:简单&#xff0c;不需要其它技术的参与缺点:不能为应用程序定义资源使用边界&#xff0c;很难合理地分配计算资源&…