Python的异常处理(与C++对比学习)

一、C语言中错误的处理方式

  1. 用assert来判断一个表达式是否出错;
  2. 在调用接口函数时,接口函数会设置errno,我们可以通过errno,strerror(errno)来拿到错误码和错误信息。
  3. 在自定义函数中,我们设置函数错误信息处理的时候,还会采用返回值来处理,这就需要我们来定义一堆的枚举变量来对应不同返回值的错误信息代表;
  4. 在函数嵌套调用的时候,内层函数出现了问题,就需要外层函数不断通过返回值判断,来查看内层函数是否调用出错,直到在某一个外层函数可以处理错误信息时停止;

二、C++中提供了抛异常的方式

#include <iostream>
void func(int a, int b) 
{if(b == 0){throw "除0异常, b不能为0";}std::cout << "a / b = " << a / b << std::endl;
}
int main()
{try{func(1,0);}catch(const char* error){std::cout << error << std::endl;}catch(...) // 捕捉未知异常{std::cout << "Unknown" << std::endl;}std::cout << "END" << std::endl;return 0;
}

三、Python的异常处理

1. 捕获异常的格式

try:内部代码块为可能出错的代码块

except:捕获try代码块中的异常,后跟可能出现的异常,Exception为所有异常,通常放在最后一个except中,保证所有异常都会被捕获

else:表示没有异常出现,执行的代码块

finally:表示无论是否发生异常都会执行的代码块,通常用于执行必要的资源处理:文件描述符的关闭、网络连接的关闭、数据库连接的关闭。避免资源泄露

try:# 执行过程中可能出错的代码块print('try...')n = 10n = n / 1print('result is %d' % n)
except ZeroDivisionError as e:  # 捕获指定异常print('except is', e)
except Exception as total:      # 捕获所有异常print('except = ', total)
else:                           # 表示无异常做的事情(可以没有)print('No Exception')
finally:                        # 表示无论是否发生异常都会执行的代码块(可以没有)print('finally...')
print('END')

【注】:


        Python中的异常,都是一个个的类,继承于BaseException这个基类(Exception也是继承的BaseException),所以捕获基类异常时,会将所有子类异常都捕获到。

常见的异常类型与继承关系:

Built-in Exceptions — Python 3.12.4 documentation


2. logging模块记录错误信息

        在我们不主动捕获异常的时候,Python解释器会将这个异常捕获,并将错误信息打印在显示器上,如下:

def fun1():n = 10n = n / 0def fun2():fun1()def main():fun2()main()

        在Python中可以使用logging模块,在捕获异常中使用,来将Python解释器原本打印在显示器上的错误信息记录到logging中,捕获到异常后,将错误信息与异常一并输出,继续向后执行,最后正常退出

import loggingdef fun1():n = 10n = n / 0def fun2():fun1()def main():fun2()try:main()
except Exception as e:logging.exception(e)
print('END')

3. logging与print在显示器打印的顺序不同的问题

        在测试时,print 输出和 logging 模块的输出顺序可能不同,原因主要在于它们的缓冲机制和输出流的处理方式。print 函数通常会将输出内容放入缓冲区,等到缓冲区满或者遇到特定条件(如换行符)时,才会将内容真正输出到控制台或终端。而 logging 模块在默认情况下会立即将日志信息输出。

import loggingdef fun1():n = 10n = n / 0a = 1
try:a = 2fun1()
except Exception as e:logging.exception(e)
print('END a =', a)

        这里想说的就是,不要认为是程序执行顺序的问题,代码中a很好的验证了,程序永远都是自顶向下执行的

4. 主动抛出异常raise

        在Python中所有的异常类型都是一个个的类,所有我们也可以通过继承的方式来自定义一个异常类型,再使用raise来主动抛出异常。

        但自定义异常类型只在必需时使用,其它情况建议使用内置的异常类型即可

class FooError(ValueError):passdef foo(s):n = int(s)if n == 0:raise FooError('value is zero')return 10 / nfoo('0')

5. 异常的重新抛出

        主要用于一些函数内部有文件资源的使用、网络连接的使用、数据库资源的使用,不对异常做处理,而是关闭这些资源,再将异常重新抛出给外层,让外层对异常做处理

def foo(s):n = int(s)if n == 0:raise ZeroDivisionError('此时n为0,是不被允许的')return 10 / ndef bar():try:foo('0')except ZeroDivisionError as e:print('except ValueError')raisetry:bar()
except ZeroDivisionError as e:print('真正处理: ', e)

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

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

相关文章

告别堆积,迎接清新:回收小程序,打造无废生活新选择

在快节奏的现代生活中&#xff0c;物质的丰富与便利似乎成为了我们日常的一部分&#xff0c;但随之而来的&#xff0c;是日益增长的废弃物堆积问题。街道边、社区里&#xff0c;甚至是我们的家中&#xff0c;废弃物品仿佛无孔不入&#xff0c;逐渐侵蚀着我们的生活空间与环境质…

element-tree树半勾选+根据id查找树的某一项

需要添加定时器才可以及时勾选上 // 半勾选回显permissions && permissions.forEach(item > {const a setTimeout(() > {this.$nextTick(() > {this.$refs.menuTreeRef.setChecked(Number(item), true, false)clearTimeout(a)})this.$forceUpdate()}, 100)})…

基于Netty的自研流系统缓存实现挑战: 内存碎片与OOM困境

01 前言 Kafka 作为流处理平台&#xff0c;在实时流计算和在线业务场景&#xff0c;追尾读追求端到端低延迟。在离线批处理和削峰填谷场景&#xff0c;数据冷读追求高吞吐。两个场景都需要很好的数据缓存设计来支撑&#xff0c;Apache Kafka 的数据存储在本地文件&#xff0c…

抖音蓝V商家采集软件使用指南

抖音是目前非常流行的短视频平台之一&#xff0c;许多商家在抖音上通过发布视频来推广自己的产品和品牌。而蓝V商家采集软件是一款可以帮助商家快速采集蓝V用户信息的工具。本文将为大家介绍如何使用抖音蓝V商家采集软件&#xff0c;并提供相应的代码示例。 安装和配置抖音蓝V商…

pointnet2_ops_lib/.安装报错解决方案

问题 3D点云相关的代码例如pointnn、pointmlp都需要安装pointnet2_ops&#xff0c;可是基本上在安装pointnet2_ops时总会报错&#xff0c;终归原因是虚拟环境的cuda版本和安装的torch&#xff0c;torchvision&#xff0c; torchaudio版本不一致导致。 方案 这里以pointmlp&am…

智能信息检索:布尔查询

函数介绍&#xff1a; 本次实验利用了上一次实验构建成功的倒排表 send为评测提交函数 and_search为AND逻辑布尔查询 and_search_sort增添了相关度排序的功能 mul_search函数接受不同参数来确定查询的逻辑 test支持用户手动输入测试 代码实现&#xff1a; bool_search.…

Sharding-JDBC分库分表之SpringBoot主从配置

Sharding-JDBC系列 1、Sharding-JDBC分库分表的基本使用 2、Sharding-JDBC分库分表之SpringBoot分片策略 3、Sharding-JDBC分库分表之SpringBoot主从配置 前言 在开发中&#xff0c;如果对数据库的读和写都在一个数据服务器中操作&#xff0c;面对日益增加的访问量&#x…

解锁算力新极限,Xilinx UltraScale+赋能的高性能低延时FPGA加速卡

01、产品概述 AiHPC-V9P 是一款基于 AMD Virtex UltraScale FPGA VU9P 的 PCIe Gen3.0 x16 接口智能网卡&#xff0c;具有最大2*200GbE /或者16*10GbE(典型应用&#xff09;接入容量的高性能低延时智能网卡。 对外接口支持两组QSFP-DD 最高25Gb/s x8Lane 光口接入&#xf…

数据库系统概论 | MySQL | 数据定义 | 单表查询 | 嵌套查询 | 连接查询 | 带有谓词的查询

数据定义 模式的定义与删除 定义模式与删除模式&#xff1a; CREATE SCHEMA S_C_SC; DROP SCHEMA S_C_SC;进入模式&#xff1a; USE S_C_SC;建立学生表&#xff1a; CREATE TABLE Student (Sno CHAR(8) PRIMARY KEY, Sname VARCHAR(20) UNIQUE, Ssex CHAR(6), Sbirthdate …

【Sql Server】sql server 2019设置远程访问,外网服务器需要设置好安全组入方向规则

大家好&#xff0c;我是全栈小5&#xff0c;欢迎来到《小5讲堂》。 这是《Sql Server》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解。 温馨提示&#xff1a;博主能力有限&#xff0c;理解水平有限&#xff0c;若有不对之处望指正&#xff01; 目录 前言1、无法链接…

分享四款常见的内网穿透工具

本文精心筛选了四款业内领先的内网穿透解决方案&#xff1a;巴比达、花生壳、Frp及NatApp&#xff0c;旨在全面展现它们在安全、便捷与灵活性方面的独到之处&#xff0c;尤其是对花生壳、Frp和NatApp进行了详尽补充&#xff0c;以帮助读者更好地理解这些工具的内在价值。 1. 巴…

北斗防爆手持终端在化工厂的安全性能分析

北斗防爆手持终端在化工厂中的应用显著提升了安全性能&#xff0c;其卓越的防爆设计、高精度定位与监控功能、实时通信能力以及多功能集成特性&#xff0c;共同构筑了化工厂安全生产的坚实防线&#xff0c;确保了巡检人员与设备在复杂环境下的安全作业与高效管理。 北斗防爆手持…

AE-图层

目录 图层初体验 项目、合成和图层的关系 图层的通用参数 锚点&#xff08;快捷键A&#xff09; 位置&#xff08;快捷键P&#xff09; 缩放&#xff08;快捷键S&#xff09; 旋转&#xff08;快捷键R&#xff09; 不透明度&#xff08;快捷键T&#xff09; 向后平移锚…

实时监测、智能预警:电缆光纤测温系统|原理、应用与前景

实时监测、智能预警&#xff1a;电缆光纤测温系统|原理、应用与前景 电缆光纤测温系统&#xff0c;作为现代电力系统中不可或缺的一部分&#xff0c;以其独特的优势在电缆安全监控领域发挥着日益重要的作用。该系统利用光纤传感技术&#xff0c;实时监测电缆的运行温度&#x…

网站高性能架构设计——高性能缓存架构

从公众号转载&#xff0c;关注微信公众号掌握更多技术动态 --------------------------------------------------------------- 一、缓存基础 1.缓存简介 缓存提升性能的幅度&#xff0c;不只取决于存储介质的速度&#xff0c;还取决于缓存命中率。为了提高命中 率&#xff0c…

【博主推荐】HTML5好看的酷酷的个人简历、个人主页、个人网站源码

文章目录 1.设计来源1.1 主界面1.2 关于我界面1.3 我的项目界面1.4 我的经验界面1.5 我的技能界面1.6 我的文章界面1.7 联系我界面 2.效果和源码2.1 动态效果2.2 源代码 源码下载万套模板&#xff0c;程序开发&#xff0c;在线开发&#xff0c;在线沟通 作者&#xff1a;xcLeig…

智能猫砂盆怎么买才不踩雷?2024热门的三款智能猫砂盆分享!

上班外出来不及铲屎怎么办&#xff1f;那当然是入手一个智能猫砂盆啦。实不相瞒&#xff0c;以前我也是被手动铲屎长期折磨的可怜铲屎官&#xff0c;但上班出差哪有空一直盯着猫砂盆看呢&#xff1f;索性后面一不做二不休直接购入了智能猫砂盆。如果你也想将家里的普通猫砂盆换…

1. Go 九九乘法表

方式一 package mainimport "fmt"func main() {// Iterate over the rows (1 to 9)for row : 1; row < 9; row {// Iterate over the columns (1 to row)for col : 1; col < row; col {// Calculate the productproduct : row * col// Print the productfmt.P…

如何让 3D 数字孪生场景闪闪发光

今日图扑软件功能分享&#xff1a;我们将探讨 HT 系统如何通过分组管理灯光、裁切体和流光&#xff0c;以提高场景光影效果的精准度和整体可控性。 HT 中的灯光、裁切体、流光是会影响它所在区域一定范围内的其他节点的表现&#xff0c;如 场景中有个 A 灯光&#xff0c;默认情…

阿里云登陆Centos7

用自己电脑登陆Centos7太麻烦了&#xff0c;还要自己弄个虚拟机&#xff0c;一个电脑里面既有WIN又有LINUX&#xff0c;索性直接买个阿里云服务器&#xff0c;来学习Centos7。 购买 我是新用户&#xff0c;可以试用3个月&#xff0c;先用个3个月再说哈哈哈。 一系列操作之后…