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

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


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


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


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


等风来,不如追风去……


自定义异常提示
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篇。


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

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



回页首


老齐漫画头像

精品文章:

来源:老齐教室


Python 入门指南【Python 3.6.3】


好文力荐:


CSDN实用技巧博文:


Python try-except 语句用于捕获并处理异常。当代码执行过程发生异常时,程序会停止执行并抛出异常信息。如果不处理这些异常,程序就会终止。因此,我们需要使用 try-except 语句来捕获并处理异常,以保证程序的正常运行。 语法如下: ```python try: # 可能会出现异常的代码块 except Exception1: # 异常类型1的处理方式 except Exception2: # 异常类型2的处理方式 else: # 如果 try 块没有抛出任何异常,则执行 else 块 finally: # 不管是否有异常发生,都会执行 finally 块 ``` try 语句块包含可能会出现异常的代码,如果代码块异常抛出,则会自动跳转到相应的 except 块进行异常处理。 except 块用于捕获特定类型的异常,并提供相应的处理方式。如果不指定异常类型,则会捕获所有类型的异常。可以在一个 try 语句包含多个 except 块,以处理不同类型的异常。 else 块在 try 块没有抛出任何异常时执行,用于定义在没有异常发生时要执行的代码。 finally 块在无论是否有异常发生时都会执行,用于定义一些必须执行的代码,例如释放资源等。 Python 常见的异常类型包括: - AttributeError:当访问对象的属性或方法不存在时抛出。 - NameError:当访问未定义的变量时抛出。 - TypeError:当操作或函数应用于不支持它的对象类型时抛出。 - ValueError:当传递给函数的参数不正确时抛出。 - ZeroDivisionError:当除数为零时抛出。 例如: ```python try: num1 = int(input("请输入一个整数:")) num2 = int(input("请输入另一个整数:")) result = num1 / num2 print("结果为:", result) except ValueError: print("请输入整数") except ZeroDivisionError: print("除数不能为零") except: print("发生了其他异常") else: print("计算完成") finally: print("程序结束") ``` 在这个例子,我们尝试将用户输入的两个字符串转换为整数,并计算它们的商。如果输入的不是整数,会抛出 ValueError 异常;如果除数为零,会抛出 ZeroDivisionError 异常。如果发生其他异常,则会捕获所有异常。如果没有异常发生,则打印计算结果。不管有没有异常发生,都会打印“程序结束”。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梦幻精灵_cq

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值