在Python中捕获finally语句中异常消息

news2024/11/27 12:51:07

当我们在使用Python时,finally语句用于定义无论是否发生异常都必须执行的代码块。正常情况下,finally语句不会捕获异常,而是在异常处理完成后执行。如果这时候finally语句中发生了异常,它会覆盖之前的异常,并成为最终的异常。要捕获finally语句中的异常消息,可以使用tryexcept语句包裹finally块。但是具体问题具体对待,具体情况请看我一一解释。

在这里插入图片描述

1、问题背景

在 Python 中,如果需要捕获异常并打印所返回的消息,可以像这样:

class SelfDefinedException(Exception): pass

try:
    message = "Hello World!"
    raise SelfDefinedException(message)
except MyDefinedException, e:
    print "MyDefinedException", e

但这只有在 try 语句中才有效。那么,如何在 finally 子句中捕获和打印信息呢?

class SelfDefinedException(Exception): pass

try:
    message = "Hello World!"
    raise SelfDefinedException(message)
except MyDefinedException, e:
    print "MyDefinedException", e
finally:
    # What goes here? So I can see what went wrong?

从一些答案中可以得知,这是不可能的。那么,如果像这样呢?

class SelfDefinedException(Exception): pass

try:
    message = "Hello World!"
    raise SelfDefinedException(message)
except MyDefinedException, e:
    print "MyDefinedException", e
except Exception, e:
    # Hopefully catches all messages except for the one of MyDefinedException
    print "Unexpected Exception raised:", e

2、解决方案

根据Python文档,你不能在 finally 子句中访问异常信息。因此最好在 except 子句中进行检查。

所以,如果需要捕获所有内容,可以使用:

try:
    foo()
except:
    print sys.exc_info()
    raise

但是这样做几乎总是错误的。因为如果你不知道发生了哪种异常,就无法对其采取任何措施。此时,程序应该关闭并提供尽可能多的关于问题的信息。

当然,也有一些方法可以实现捕获 finally 子句中的异常消息。

例如,创建一个布尔变量 caught_exception,并在 try 语句中对其赋值为 None,并在 finally 中检查其值。如果该值不为 None,则说明发生了异常,此时可以获取异常消息并重新抛出。

caught_exception=None
try:
  x = 10/0
  #return my_function()
except Exception as e:
  caught_exception = e
finally:
  if caught_exception:
     #Do stuff when exception
     raise # re-raise exception
  print "No exception"

或者,可以使用 logging 模块将异常消息记录到日志文件中,这样就可以在以后进行查看。

import logging

try:
    # Do something that might raise an exception
except Exception as e:
    logging.exception("An error occurred:")
finally:
    # Do something whether an exception occurred or not

代码例子:

# Define a custom exception
class MyException(Exception):
    def __init__(self, message):
        self.message = message

# Create a function that raises an exception
def my_function():
    raise MyException("This is an exception message")

try:
    my_function()
except MyException as e:
    print(f"Caught exception: {e.message}")
finally:
    print("This will always be printed, regardless of whether an exception was raised or not.")

在这个例子中,try 语句块中调用了 my_function() 函数,该函数会引发 MyExceptionexcept 语句块捕获了这个异常,并打印了异常消息。finally 语句块在 try 语句块和 except 语句块之后执行,无论是否发生了异常,它都会被执行。

总体来说,想要捕获finally块中的异常消息,这就需要我们在finally块内使用另一个tryexcept语句来捕获可能发生的异常。如果有更多得问题可以评论区留言讨论。

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

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

相关文章

【递归】:原理、应用与案例解析 ,助你深入理解递归核心思想

递归 1.基础简介 递归在计算机科学中,递归是一种解决计算问题的方法,其中解决方案取决于同一类问题的更小子集 例如 递归遍历环形链表 基本情况(Base Case):基本情况是递归函数中最简单的情况,它们通常是递…

代码随想录 Leetcode509. 斐波那契数

题目&#xff1a; 代码&#xff08;首刷自解 2024年2月19日&#xff09;&#xff1a; class Solution { public:int fib(int n) {if (n < 2) return n;/*三个数表示加法算式里的 加数 加数 和*//*初始化*/int leftVal 0;int rightVal 1;int sum 0;for (int i 2; i <…

循环队列|超详细|数据结构学习讲解与笔记

队列元素先进先出队列只允许在线性表的一端进行操作&#xff0c;是一种操作受限的线性表 队列的基本操作 InItQueue(&Q)初始化队列&#xff0c;构造一个空队列 QEmptyQueue(Q)队列判空FullQueue(Q)队列判满EnQueue(&Q , x)入队操作DeQueue(&Q , &x)出队操作G…

数据结构通讲

目录 集合源码详解 一、常见数据结构讲解 1. 线性数据结构 1.1 数组 1.2 队列 1.3 链表 1.3.1 单向链表 1.3.2 双向链表 1.4 栈 2. 非线性数据结构 2.1 树 2.2 二叉树 2.2.1 概念介绍 2.2.2 遍历操作 2.2.3 删除节点 2.2.4 查找局限性 2.2.5 AVL&#xff08; …

应急响应实战笔记02日志分析篇(4)

第4篇:MSSQL日志分析 常见的数据库攻击包括弱口令、SQL注入、提升权限、窃取备份等。对数据库日志进行分析&#xff0c;可以发现攻击行为&#xff0c;进一步还原攻击场景及追溯攻击源。 0x01 MSSQL日志分析 首先&#xff0c;MSSQL数据库应启用日志记录功能&#xff0c;默认配…

Ubuntu系统搭建HadSky论坛并结合内网穿透实现无公网ip远程访问

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

消息队列(Message Queue)

目录 一、概念 二、消息队列使用场景 三、消息队列的两种模式 1.点对点模式 2.发布/订阅模式 四、常用消息队列介绍 1.RabbitMQ 1) 主要特性 2&#xff09;安装需要 3&#xff09;优点 4&#xff09;缺点 2.ActiveMQ 1&#xff09;主要特性 2) 安装需要 3&#xff09;优…

专业140+总分420+南京信息工程大学811信号与系统考研经验南信大电子信息与通信工程,真题,大纲,参考书

今年顺利被南信大电子信息录取&#xff0c;初试420&#xff0c;专业811信号与系统140&#xff08;Jenny老师辅导班上140很多&#xff0c;真是大佬云集&#xff09;&#xff0c;今年应该是南信大电子信息最卷的一年&#xff0c;复试线比往年提高了很多&#xff0c;录取平均分380…

Spring | Spring事务管理

目录&#xff1a; 1.Spring事务管理 “含义”2.Spring事务管理的 三个“核心接口” :2.1 PlatformTransactionManager 接口PlatformTransactionManager接口 (3个“事务操作方法”)PlatformTransactionManager接口的 “实现类” 2.2 TransactionDefinition 接口2.3 TransactionS…

flex布局、grid布局中的justify、align属性

一、grid中justify-content和justify-items的区别&#xff08;align同理&#xff09;&#xff08;flex中的justify-items属性无效&#xff09; justify-content:相对于父级&#xff0c;水平方向将整体进行对齐 justify-items:针对于每个格&#xff0c;将里面的内容进行对齐&a…

PAT (Basic Level) Practice | 数字分类

答案 #include <stdio.h> int main() {static int N, a, b[5], flag 0, c, flag1 0;scanf("%d", &N);for(int i 0; i < N; i) {scanf("%d", &a);if(a % 5 0) {if(a % 2 0) {b[0] a;}} else if(a % 5 1) {if(flag 0) {b[1] a;fl…

如何根据需求理解CPU、SoC和MCU的区别

在当今数字化的世界中&#xff0c;我们经常听到关于CPU、SoC和MCU的名词&#xff0c;它们都是计算机科学和电子工程领域中的重要组成部分。然而&#xff0c;这三者之间存在着明显的区别。本文将深入探讨CPU&#xff08;中央处理器&#xff09;、SoC&#xff08;系统芯片&#x…

如何使用Net2FTP部署本地Web网站并实现远程文件共享

文章目录 1.前言2. Net2FTP网站搭建2.1. Net2FTP下载和安装2.2. Net2FTP网页测试 3. cpolar内网穿透3.1.Cpolar云端设置3.2.Cpolar本地设置 4.公网访问测试5.结语 1.前言 文件传输可以说是互联网最主要的应用之一&#xff0c;特别是智能设备的大面积使用&#xff0c;无论是个人…

重启项目后Session依旧存在的问题研究

1. 背景 最近在开发对接智谱AI超拟人大模型&#xff0c;放了方便在pom.xml中引入了热部署相关的依赖。 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><scope>runtime</sco…

一元函数微分学【高数笔记】

1. 什么是微分&#xff1f;什么是微商&#xff1f; 2. 什么是函数的微分&#xff1f; 3. 在函数的微分中&#xff0c;有什么样的关系&#xff1f; 4. 一元函数的微分运用在什么题型中&#xff1f; 5. 什么是一元函数&#xff1f;

【JavaScript】实现下--刘谦春晚魔术:约瑟夫环的数学魅力!

2024年春晚刘谦的魔术堪称惊艳全场&#xff0c;那么他这个魔术实现的原理是什么呢&#xff1f;今天&#xff0c;就让咱们使用 JS 是实现这个魔术。 约瑟夫环问题简介&#x1f3b4;&#x1f50e; 约瑟夫环问题源自古罗马&#xff0c;由历史学家约瑟夫斯提出&#xff0c;而它的…

【STM32】硬件SPI读写W25Q64芯片

目录 基础知识回顾&#xff1a; SPI外设简介 SPI框图 主模式全双工连续传输 非连续传输 初始化SPI外设 核心代码 - 交换一个字节 硬件接线图 Code 程序配置过程 MySPI.c MySPI.h W25Q64.c W25Q64.h W25Q64_Ins.h main.c 基础知识回顾&#xff1a; 【STM32】SP…

Linux CentOS系统安装SQL Server并结合内网穿透实现公网访问本地数据

&#x1f525;博客主页&#xff1a; 小羊失眠啦. &#x1f3a5;系列专栏&#xff1a;《C语言》 《数据结构》 《C》 《Linux》 《Cpolar》 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&…

Android---Retrofit实现网络请求:Java 版

简介 在 Android 开发中&#xff0c;网络请求是一个极为关键的部分。Retrofit 作为一个强大的网络请求库&#xff0c;能够简化开发流程&#xff0c;提供高效的网络请求能力。 Retrofit 是一个建立在 OkHttp 基础之上的网络请求库&#xff0c;能够将我们定义的 Java 接口转化为…

汽车网络安全--关于供应商网络安全能力维度的思考

目录 1.关于CSMS的理解 2.OEM如何评审供应商 2.1 质量评审 2.2 网络安全能力评审 3.小结 1.关于CSMS的理解 最近在和朋友们交流汽车网络安全趋势时&#xff0c;讨论最多的是供应商如何向OEM证明其网络安全能力。 这是很重要的一环&#xff0c;因为随着汽车网络安全相关强…