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

news2024/9/24 15:25:57

一、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 = 10
    n = n / 1
    print('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 = 10
    n = n / 0


def fun2():
    fun1()


def main():
    fun2()


main()

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

import logging


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


def fun2():
    fun1()


def main():
    fun2()


try:
    main()
except Exception as e:
    logging.exception(e)
print('END')

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

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

import logging


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


a = 1
try:
    a = 2
    fun1()
except Exception as e:
    logging.exception(e)
print('END a =', a)

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

4. 主动抛出异常raise

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

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

class FooError(ValueError):
    pass


def foo(s):
    n = int(s)
    if n == 0:
        raise FooError('value is zero')
    return 10 / n


foo('0')

5. 异常的重新抛出

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

def foo(s):
    n = int(s)
    if n == 0:
        raise ZeroDivisionError('此时n为0,是不被允许的')
    return 10 / n


def bar():
    try:
        foo('0')
    except ZeroDivisionError as e:
        print('except ValueError')
        raise


try:
    bar()
except ZeroDivisionError as e:
    print('真正处理: ', e)

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

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

相关文章

【C++题解】1290 - 二进制转换十进制

问题&#xff1a;1290 - 二进制转换十进制 类型&#xff1a;进制转换 题目描述&#xff1a; 请将一个 25 位以内的 2 进制正整数转换为 10 进制&#xff01; 输入&#xff1a; 一个 25 位以内的二进制正整数。 输出&#xff1a; 该数对应的十进制。 样例&#xff1a; 输…

国芯方案|珠宝口袋秤芯片方案

口袋秤顾名思义就是可以放进口袋里面的电子秤。可能这个目前在国内使用的人比较少&#xff0c;但在西方国家口袋秤却是可以用来送礼的物品。因为口袋秤的外观跟手机外观大多相似&#xff0c;所以也有人称口袋秤为手机秤。口袋秤主要是用在珠宝、科研、工厂等小物件的高精度测量…

【面试八股总结】面向对象三大特性、虚函数、纯虚函数、虚继承

参考资料&#xff1a;阿秀 一、面向对象三大特性 封装&#xff1a;将数据和代码捆绑在一起&#xff0c;避免外界干扰和不确定性访问 继承&#xff1a;让某种类型对象获得另一个类型对象的属性和方法 多态&#xff1a;同一种事务表现出不同事务的能力&#xff0c;即&#xf…

井字游戏00

题目链接 井字游戏 题目描述 注意点 1 < board.length board[i].length < 100输入一定遵循井字棋规则 解答思路 如果某一方想要获胜&#xff0c;则其需要占满某一行或某一列或对角线&#xff0c;所以只需要根据第一行和第一列判断是否填充完某一行或某一列或对角线…

开源项目预告Demo演示:应用极其简单的多级GUI库

之前在做项目的时候&#xff0c;需要用到多级GUI&#xff0c;当时使用的是用数组穷举列出来各个界面的方式&#xff08;也有人管它叫索引法&#xff09;&#xff0c;缺点也是很多的&#xff0c;比如开发繁琐&#xff0c;维护不便&#xff0c;难以添加过渡动画&#xff0c;各个界…

【基于R语言群体遗传学】-14-种群起源的相对似然

我们可以将预测的基因型比例视为在种群中看到一组特定等位基因的概率。如果种群在等位基因频率上存在差异&#xff0c;我们可以使用基因型来推断个体起源于每个种群的相对可能性。大家可以先看一下之前的博客&#xff1a;群体遗传学_tRNA做科研的博客-CSDN博客 种群起源的相对似…

同星智能正式推出CAN总线一致性测试系统

CAN总线一致性测试系统 CAN FD/CAN总线一致性测试系统&#xff0c;在硬件系统上基于同星自主研发的总线分析工具&#xff0c;干扰仪&#xff0c;一致性测试机箱&#xff0c;并搭配程控电源&#xff0c;示波器&#xff0c;数字万用表等标准外围仪器设备&#xff1b;在软件上基于…

Python轻松实现人脸检测,打造专业级AI颜值鉴定工具

Python实现人脸检测 1. 简介1.1 人脸检测的背景和意义1.2 使用Python进行人脸检测的优势1.2.1 多种成熟的库和工具1.2.2 开发者社区的支持1.2.3 简便易用的语法和库 2. 准备工作2.1 Python环境的安装2.1.1 下载Anaconda2.1.2 安装Anaconda2.1.3 使用Anaconda 2.2 第三方库的安装…

数据结构——Trie

题目&#xff1a; 维护一个字符串集合&#xff0c;支持两种操作&#xff1a; I x 向集合中插入一个字符串 x&#x1d465;&#xff1b;Q x 询问一个字符串在集合中出现了多少次。 共有 N&#x1d441; 个操作&#xff0c;所有输入的字符串总长度不超过 10^5&#xff0c;字符串仅…

使用Python绘制箱线图并分析数据

使用Python绘制箱线图并分析数据 在这篇博客中&#xff0c;我们将探讨如何使用Python中的pandas库和matplotlib库来绘制箱线图&#xff0c;并分析数据文件中的内容。箱线图是一种常用的图表类型&#xff0c;用于展示数据的分布情况及其统计特性&#xff0c;如中位数、四分位数…

【Linux】vim详解

1.什么是vi/vim? 简单来说&#xff0c;vi是老式的文本编辑器&#xff0c;不过功能已经很齐全了&#xff0c;但是还是有可以进步的地方。vim则可以说是程序开发者的一项很好用的工具&#xff0c;就连 vim的官方网站&#xff08; http://www.vim.org&#xff09;自己也说vim是一…

【Perforce】QAC-分析时如何不应用某些规则

【更多软件使用问题请点击亿道电子官方网站】 1、 文档目标 解决扫描项目时如何不应用某些规则进行分析。 2、 问题场景 对于一些建议性的MISRA规则&#xff0c;不想用于项目扫描&#xff0c;如何处理&#xff1f; 3、软硬件环境 1、软件版本&#xff1a;HelixQAC23.04 2…

STM32CubeIDE离线汉化教程

按照网上的方法下载好ZIP文件后 帮助->安装新软件-> 按顺序选择文件 点击完成&#xff0c;后等待右下脚的精度条到位即可

总结之企业微信(一)——创建外部群二维码,用户扫码入群

创建外部群 企微接口中没有直接通过服务端API接口创建外部群 可以通过jssdk创建外部群&#xff1a;引用jssdk调用会话接口wx.openEnterpriseChat https://work.weixin.qq.com/api/doc/90000/90136/90511 创建外部群二维码 需要通过企业微信的应用&#xff0c;并且配置客户联…

绝区陆--大语言模型的幻觉问题是如何推动科学创新

介绍 大型语言模型 (LLM)&#xff08;例如 GPT-4、LLaMA-2、PaLM-2、Claude-2 等&#xff09;已展示出为各种应用生成类似人类文本的出色能力。然而&#xff0c;LLM 的一个鲜为人知的方面是它们倾向于“产生幻觉”或生成不正确或没有根据的事实陈述。我不认为这仅仅是一个限制…

下载安装Microsoft DirectX SDK(June 2010)

官方下载网址如下&#xff1a; Microsoft DirectX SDK(June 2010)链接 下载后是一个.exe文件 在安装之前&#xff0c;需要先检查你的电脑中是否已经安装过&#xff08;如果你安装过VS&#xff0c;那么一定会有这两个文件&#xff09; Microsoft Visual C 2010 x86 Redistribu…

解决 NullReferenceException: Object reference not set to an instance of an object

在 Unity 中 利用 URDF Importer import UR5e_gripper 的 URDF file 时出现错误&#xff1a; NullReferenceException: Object reference not set to an instance of an object。 理论上是有个Object 是 Null&#xff0c;当我再次检查URDF后仍觉得路径没有写错。 于是我 把Mesh…

压缩感知2——算法模型

采集原理 其中Y就是压缩后的信号表示(M维)&#xff0c;Φ表示采集的测量矩阵&#xff0c;可以是一个随机矩阵&#xff0c;X代表原始的数字信号&#xff08;N维&#xff09;。 常见的测量矩阵——随机高斯矩阵 随机伯努利矩阵 稀疏随机矩阵等&#xff0c;矩阵需要满足与信号的稀…

SenseVoice - 阿里最新开源精准多语言语音识别与情感辨识模型 本地一键整合包下载

阿里巴巴近期发布了开源语音大模型项目FunAudioLLM&#xff0c;该项目包含了两个核心模型&#xff1a;SenseVoice和CosyVoice。可以精准多语言识别并且进行语音克隆 本地一键包下载地址&#xff1a; SenseVoice - 精准多语言语音识别与情感辨识模型 本地一键整合包下载 SenseVo…

Appium-移动端自动测试框架详解

Appium是一个开源跨平台移动应用自动化测试框架。 既然只是想学习下Appium如何入门&#xff0c;那么我们就直奔主题。文章结构如下&#xff1a; 为什么要使用Appium&#xff1f;如何搭建Appium工具环境?(超详细&#xff09;通过demo演示Appium的使用Appium如何实现移动端UI自…