【第五节】python异常处理

news2024/11/23 13:25:58

目录

一、python中的异常用法

1.1 try-except

1.2 异常处理流程:

1.3 try-finally

1.4 使用`except`是否指定异常

二、异常的参数

三、自定义异常

四、常见的异常列举


一、python中的异常用法

        异常是指程序运行过程中出现的非正常状态。在Python编程中,异常通过异常对象来表示。当程序在编译或运行时遇到错误,执行流程会发生变化,抛出异常对象,程序流进入异常处理阶段。对于Python解释器而言,一旦抛出异常,程序会立即停止并输出错误信息。然而,Python允许程序员捕获这些异常并进行处理,从而使程序能够继续执行。

1.1 try-except

        如果我们预知可能发生的异常类型,可以使用异常捕获机制来截获这些异常。例如,变量`a`未定义,直接打印会引发错误,但通过异常处理,情况会有所不同。

try:
    print(a)
except NameError:
    pass
print("123")

        运行上述代码时,不会显示任何错误,因为我们使用`except`捕获了`NameError`异常。`pass`语句表示执行了相应的操作,但实际上什么也不做。这样,程序能够继续执行并打印出"123"。`except`后面跟随的是要捕获的异常类型。再看下面的例子:

try:
    list1 = [1, 2, 3, 4, 5]
    print(list1[5])
except NameError:
    pass
print('hehe')

        在这段代码中,列表访问越界,但由于捕获的是名称异常,程序仍然会中断。常用的捕获格式如下:

try:
<语句>        #运行别的代码
except <名字>:
<语句>        #如果在try部份引发了'name'异常
except <名字>,<数据>:
<语句>        #如果引发了'name'异常,获得附加的数据
else:
<语句>        #如果没有异常发生

1.2 异常处理流程:

        1. 如果在运行时发生异常,解释器会查找相应的处理语句。
        2. 如果在当前函数中未找到处理语句,异常会被传递给上层调用函数,以查看是否能被处理。
        3. 如果在最外层仍未找到处理语句,解释器会退出,并打印出traceback,以便用户识别错误原因。

        程序员还可以使用raise主动抛出异常,让`except`捕获,如下所示:

name = input("please input name:")
if name == 'hello':
    raise NameError('input name error!')

1.3 try-finally

        在Python中,异常处理还包括`try-finally`语句。无论是否捕获到错误,`finally`块中的代码都会被执行。这在需要清理资源(如关闭文件、断开网络连接等)时非常有用。

try:
    # 一些可能会引发异常的代码
    pass
finally:
    # 清理资源的代码
    pass

        通过这种方式,我们可以确保在任何情况下,资源都能得到适当的清理。

1.4 使用`except`是否指定异常

        使用`except`而不指定任何异常类型

        你可以在不指定任何异常类型的情况下使用`except`,如下所示:

try:
    # 正常的操作
    # ......................
except:
    # 发生异常时执行的代码块
    # ......................
else:
    # 如果没有异常执行的代码块
    # ......................

        这种方式的`try-except`语句会捕获所有发生的异常。然而,这不是一个推荐的做法,因为它无法让我们识别出具体的异常信息。由于它会捕获所有的异常,这可能导致难以调试和定位问题。

        使用`except`并指定多种异常类型

        你也可以使用同一个`except`语句来处理多种异常,如下所示:

try:
    # 正常的操作
    # ......................
except (Exception1, Exception2, ..., ExceptionN):
    # 发生上述多个异常中的任何一个时执行的代码块
    # ......................
else:
    # 如果没有异常执行的代码块
    # ......................

        通过这种方式,你可以更精确地处理特定的异常,从而提高代码的可读性和可维护性。

二、异常的参数

        一个异常可以携带参数,这些参数可以作为输出的异常信息。

        你可以通过`except`语句来捕获异常及其参数,如下所示:

try:
    # 正常的操作
    # ......................
except ExceptionType as Argument:
    # 你可以在这里输出 Argument 的值...

        变量接收的异常值通常包含在异常的语句中。在元组的形式中,变量可以接收一个或多个值。

元组通常包含错误字符串、错误数字、错误位置等信息。

### 实例

以下是一个捕获单个异常的实例:

#!/usr/bin/python
# -*- coding: UTF-8 -*-

# 定义函数
def temp_convert(var):
    try:
        return int(var)
    except ValueError as Argument:
        print("参数没有包含数字\n", Argument)

# 调用函数
temp_convert("xyz")

以上程序执行结果如下:

$ python test.py
参数没有包含数字
invalid literal for int() with base 10: 'xyz'

        在这个例子中,`temp_convert`函数尝试将输入的字符串转换为整数。如果输入的字符串不能转换为整数(例如"xyz"),则会引发`ValueError`异常,并且异常的参数会被捕获并打印出来。

三、自定义异常

        在Python中,你可以通过创建一个新的异常类来定义自己的异常。自定义异常类通常继承自内置的`Exception`类或其他更具体的异常类。以下是如何创建和使用自定义异常的基本步骤:

1. **定义自定义异常类**:
   创建一个新的类,继承自`Exception`或其子类。

2. **添加构造函数**:
   通常,自定义异常类会包含一个构造函数,用于接收错误信息并将其存储在实例变量中。

3. **使用自定义异常**:
   在代码中引发自定义异常,并使用`try-except`块捕获和处理它。

以下是一个简单的示例:

# 定义自定义异常类
class MyCustomError(Exception):
    def __init__(self, message):
        super().__init__(message)
        self.message = message

# 使用自定义异常
def divide(a, b):
    if b == 0:
        raise MyCustomError("除数不能为零")
    return a / b

# 捕获和处理自定义异常
try:
    result = divide(10, 0)
except MyCustomError as e:
    print(f"捕获到自定义异常: {e}")
else:
    print(f"结果是: {result}")

在这个示例中:

1. `MyCustomError`是一个自定义异常类,继承自`Exception`。
2. `MyCustomError`类的构造函数接收一个错误信息,并调用父类的构造函数来初始化它。
3. `divide`函数在除数为零时引发`MyCustomError`异常。
4. 使用`try-except`块捕获并处理`MyCustomError`异常,打印错误信息。

通过这种方式,你可以创建具有特定含义的自定义异常,使代码更具可读性和可维护性。

四、常见的异常列举

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

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

相关文章

线程的创建Linux下

进程的创建&#xff1a;第一个参数通常传递一个pthread_t 的地址&#xff0c;第二个参数为线程的属性&#xff0c;第三个参数为函数指针&#xff0c;是子线程要做的事情。arg是函数指针所对应函数的参数。 sleep主要是为了等待子线程退出&#xff0c;因为当主线程退出时&#x…

WebSocket connection to ‘ws://x.x.x.x:8080/ws‘ failed:报错

vue.config.js中进行修改 添加 devServer: { Proxy: {ws:false }}

Flink-StarRocks详解:第二部分(第52天)

文章目录 前言2. 表设计2.1 StarRocks表设计2.1.1 列式存储2.1.2 索引2.1.3 加速处理2.1.3.1 预先聚合2.1.3.2 分区分桶2.1.3.3 物化视图2.1.3.4 列级索引 2.2 数据模型2.2.1 明细模型2.2.1.1 适用场景2.2.1.2 创建表2.2.1.3 使用说明 2.2.2 聚合模型2.2.2.1 适用场景2.2.2.2 原…

[C++] vector对比list deque的引出

文章目录 list与vector的对比双端队列dequedeque的特性deque的底层实现原理内存结构块表&#xff08;Block Array&#xff09;块&#xff08;Block&#xff09; 插入与删除两端插入两端删除 随机访问如何计算位置 迭代器设计 总结 list与vector的对比 vector与list都是STL中非…

实战AR增强现实【OpenCV+Ogre】

作为一份小小的礼物&#xff0c;我想向你展示借助 Ogre 和 OpenCV 自己制作增强现实变得多么容易。你应该知道&#xff0c;除了图形之外&#xff0c;我的另一个兴趣是计算机视觉。 演示将不依赖于 ARCore 或 ARKit 等专有解决方案 - 所有这些都将使用开源代码完成&#xff0c;…

【ROS2】 默认的DDS通信中间件替换为Eclipse Cyclone_DDS (DDS配置方法)

ROS2替换中间件为Cyclone_DDS 1.一些介绍&#xff1a;&#xff09;2.不同DDS的RMW实现3.默认的FastDDS替换为Cyclone DDSi.安装依赖ii.编译 cyclone-dds 4.配置网络 1.一些介绍&#xff1a;&#xff09; 上一篇我们探讨了ros1和ros2编写launch的区别 【ROS2】launch启动文件编…

相机外参矩阵

在上一篇文章中&#xff0c;我们学习了如何将相机矩阵分解为内参矩阵和外参矩阵的乘积。在接下来的两篇文章中&#xff0c;我们将更详细地探讨外参矩阵和内参矩阵。首先&#xff0c;我们将探讨查看外参矩阵的各种方式&#xff0c;并在最后进行交互式演示。 SDT工具推荐&#xf…

程序员必知必懂运维技术概念

引言 随着互联网和云计算的迅速发展&#xff0c;传统的单体架构逐渐被微服务架构所取代。这一变化带来了许多新的挑战&#xff0c;如环境一致性、应用的可移植性、服务的扩展性、服务间通信的管理以及安全性等。为了解决这些问题&#xff0c;业界开发了许多工具和技术&#xf…

SPSSAU | Adaboost模型原理及案例实操

AdaBoost&#xff08;Adaptive Boosting&#xff09;算法的核心思想是将多个弱分类器组合成一个强分类器。其算法步骤如下&#xff1a; 第一&#xff1a;初始化权重&#xff0c;为每个训练样本分配相等的初始权重&#xff1b; 第二&#xff1a;训练弱分类器&#xff0c;根据当…

如何做OLED屏幕安装方案

制定OLED屏幕安装方案时&#xff0c;需要综合考虑多个方面&#xff0c;包括安装环境、屏幕尺寸、支架选择、电源与信号连接、调试与测试等。以下是一个详细的OLED屏幕安装方案&#xff1a; 一、前期准备 确定安装位置&#xff1a; 根据使用需求和环境条件&#xff0c;选择一个…

基于FPGA的以太网设计(4)----详解PHY的使用(以YT8531为例)

目录 1、前言 2、如何了解PHY芯片? 2.1、总览 2.2、管脚 2.3、编码 2.4、自协商 2.5、环回模式 2.6、睡眠模式 2.7、复位 2.8、PHY地址 3、PHY芯片的寄存器配置 3.1、Basic Control Register (0x00) 3.2、Basic StatusRegister (0x01) 3.3、PHY Specific Status…

重生了,这一世 我一定要学会服务器 只因………

你好,我是Qiuner. 为帮助别人少走弯路和记录自己编程学习过程而写博客 这是我的 github https://github.com/Qiuner ⭐️ ​ gitee https://gitee.com/Qiuner &#x1f339; 如果本篇文章帮到了你 不妨点个赞吧~ 我会很高兴的 &#x1f604; (^ ~ ^) 想看更多 那就点个关注吧 我…

IT运维管理与ITSM:理论与实践

IT运维管理和IT服务管理&#xff08;ITSM&#xff09;在现代企业信息化过程中占据着举足轻重的地位。它们不仅是确保IT系统稳定运行和业务连续性的关键&#xff0c;还是推动企业数字化转型、提升竞争力的重要力量。本文将结合《IT运维管理和ITSM》文档的内容&#xff0c;深入探…

【C++/STL】:哈希的应用 -- 位图布隆过滤器

目录 &#x1f680;&#x1f680;前言一&#xff0c;位图1. 位图的概念2. STL库中的位图3. 位图的设计4. 位图的模拟实现5. 位图的优缺点6. 位图相关考察题⽬ 二&#xff0c;布隆过滤器1. 布隆过滤器的概念2. 布隆过滤器的实现3. 布隆过滤器删除问题4. 布隆过滤器的优缺点 点击…

江森自控引入电子签,“碳”索智能建筑数字未来

近年来&#xff0c;伴随着科技的不断进步和市场领域的持续延伸&#xff0c;智能建筑已然成为建筑业科技升级的必经之路。 作为智能建筑领域的全球领导者&#xff0c;江森自控始终走在数字化变革前列&#xff0c;并在业内率先引入了电子合同&#xff0c;通过全流程线上进行的签…

【办公类-53-03】2024年第一学期校历制作(“月/日(星期)”版、排班表、跳过节日和周三)

背景需求&#xff1a; 前期代码制作出2024年第一学期校历&#xff0c;按照5天一周的方法&#xff0c;提取实际工作日。制作成“周计划教案”使用的长日期、短日期 -【办公类-53--01】2024年第一学期校历制作&#xff08;星火讯飞提取实际工作日&#xff0c;5天一行&#xff0…

Spring-Retry 框架实战经典重试场景

Spring-Retry框架是Spring自带的功能&#xff0c;具备间隔重试、包含异常、排除异常、控制重试频率等特点&#xff0c;是项目开发中很实用的一种框架。 1、引入依赖 坑点&#xff1a;需要引入AOP&#xff0c;否则会抛异常。 xml <!-- Spring-Retry --> <dependency&…

【AI大模型】通义千问:开启语言模型新篇章与Function Call技术的应用探索

文章目录 前言一、大语言模型1.大模型介绍2.大模型的发展历程3.大模型的分类a.按内容分类b.按应用分类 二、通义千问1.通义千问模型介绍a.通义千问模型介绍b.应用场景c.模型概览 2.对话a.对话的两种方式通义千问API的使用 b.单轮对话Vue页面代码&#xff1a;Django接口代码 c.多…

【C++】—— 类与对象(一)

【C】—— 类与对象&#xff08;一&#xff09; 1、类的定义1.1、类定义1.1.1、类定义格式1.1.2、成员变量的标识1.1.3、C 中的 s t r u c t struct struct1.1.4、C 中的内联函数1.1.5、总结 1.2、访问限定符1.3、类域 2、实例化2.1、实例化的概念2.2、对象大小2.2.1、对象的大…