14. 异常处理

news/2024/10/8 19:43:59/文章来源:https://www.cnblogs.com/FlurryHeart/p/18452354

一、什么是异常

  程序在运行过程之中,不可避免的出现一些错误,比如:使用了没有赋值的变量、使用了不存在的索引、除 0 等等。这些错误在程序中,我们称之为异常。程序运行过程中,一旦出现异常将会导致程序立即终止,异常以后的代码全部都不会执行。

二、异常的传播

  当在函数中出现异常时,如果在函数中对异常进行了处理,则异常不会继续传播。如果函数中不会对异常进行处理,,则异常会继续向函数调用处传播。如果函数调用处处理了异常,则不再传播,如果没有则继续向调用处传播。直到传递到全局作用域(主模块),如果依然没有处理,则程序终止,并显示异常信息。

  当程序运行过程中出现异常以后,所有的异常信息会被保存在一个专门的异常对象,而异常传播时,实际上就是异常对象抛给了调用处。比如,ZeroDivisionError 类的对象专门用来表示除 0 的异常,NameError 类的对象专门用来处理变量错误的异常。在 Python 中提供了多个异常对象。

def fun1():a  = 10 / 0def fun2():fun1()def fun3():fun2()fun3()

三、异常处理机制

  程序运行时出现异常,目的并不是让程序直接终止。Python 是希望在出现异常时,我们可以编写代码来对异常进行处理。遇到异常时,Python 中有两种处理机制。

3.1、try...except机制

  在 Python 中,提供 try...catch 语句捕获并处理异常。在使用时,把可能产生异常的代码放在 try 子句中,把处理结果放在 except 子句中。这样,当 try 子句中的代码块出现异常时,就会执行 except 语句块中的内容。如果 try 语句块中代码没有异常,那么 except 语句块不会执行。这样我们就可以通过代码来处理异常,避免因为一个异常导致整个程序的终止。

  我们还可以在原有的基础上在添加一个 else 子句,用于指定当 try 语句块中没有出现异常时要执行的语句块。该语句块中的内容当 try 语句中发现异常时,将不被执行。

  我们还可以在添加一个 finallty 子句。该子句中的代码无论是否发生异常都会被执行。

try:代码块(可能出现异常的代码)
except [异常名 [as 异常对象名]]:代码块(出现错误以后的处理方式)
[else:代码块(没出现时要执行的语句)]
[finally:代码块(无论是否出现异常,该子句都会执行)]

  如果 except 后面不跟任何内容,则此时它会捕获所有的异常。

print("异常处理之前")try:# try中放置的是可能错误的代码print(10/0)
# 如果except后不跟任何内容,此时它会获取所有的错误
except:# except中放置的是出现以后的处理代码print("出现异常")
# 这是一个可选的结构,表示没有出现异常要执行的代码
else:print("程序正常异常,没有错误")
# 这是一个可选结构,表示无论是否出现异常,最后都要执行的语句
finally:print("无论是否出现异常,该子句都会执行")print("异常处理之后")

  如果 except 后面跟者异常类型,那么该类型对应的异常。我们还可以在在异常类后面跟着一个 as xxx,此时 xxx 就是异常对象。

try:# try中放置的是可能错误的代码print(10/0)print(a)1 + "hello"
# 如果except后不跟着异常的类型,那么它只会捕获该类型对应的异常
# 可以在异常类后面跟着一个 as xxx,此时xxx就是异常对象
except NameError as e:# except中放置的是出现以后的处理代码print("出现NameError")print(e)
except ZeroDivisionError as e:# except中放置的是出现以后的处理代码print("出现ZeroDivisionError")print(e)
# Exception 是所有异常类的父类
# 如果except后跟的是 Exception,它会捕获所有的异常
except Exception as e:print("未知异常")print(e)

在使用 try...except语句捕获异常时,如果在 except 后面不指定异常名称,则表示捕获全部异常;

在使用 try...except语句捕获异常时,当程序出现异常并处理完后,程序继续执行;

我们可以在 except 语句后面使用一对小括号将可能出现的异常名称括起来,多个异常之间使用逗号分隔。

3.2、raise机制

  如果某个函数或方法可能会产生异常,但不想在当前函数或方法中处理这个异常,则可以使用 raise 语句在函数或方法中抛出异常。

raise [异常类型名[异常描述]]

  如果异常类型名为可选参数,它用于指定抛出的异常名称以及异常信息的相关描述。如果省略,就会把当前的错误原样抛出。异常描述也可以省略,如果省略,则在抛出异常时,不附带任何描述信息。

def div(a,b):if b == 0:# raise用于向外部抛出异常# 后面可以根一个异常类,或异常类的对象raise ZeroDivisionError("除0异常")return a/bprint(div(10,0))

四、自定义异常类

  我们也可以自定义异常类,只需要创建一个类继承 Exception 类即可。

class MyException(Exception):pass

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

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

相关文章

csp-s 模拟 8

难度 ★★★★☆csp-s模拟8 T1 score and rank 特殊性质,题意转换 妙妙题 对于 \(S\) 小于等于 \(0\) 的情况答案显然是所有大于等于 \(S\) 的个数。 现在讨论 \(S\) 大于 \(0\) 的情况。 先对序列做一个前缀和,题目要求即是让所有值减去前缀最小值小于 \(S\) 考虑有一段连续…

C#联合Visionpro编程学习记录,视觉中需要考虑旋转中心工况的计算方法探讨

一、考虑旋转中心的工况解法, 1,视觉中引导定位或者对位贴合时,机械手或者xyzr轴上手爪中心和末端轴中心不同轴时,就要考虑旋转中心问题; 2,如果设备的CT要求没有很苛刻,可以采用2次拍照的方案解决,1次拍照后纠偏角度,然后在纠正角度后的位置2次拍照纠正x、y偏差;看下…

海外模组联网非常难?不往忘了APN配置…

​除了中国之外,国外的4G信号都比较差劲。 做海外的设备,如果忽视了射频的信号质量,肯定是要吃大亏的! 所以,海外模组的联网问题,会比国内要多不少。 客户在实际应用中或多或少都会遇到:网络相关问题:例如:连不上网,APN不会配置,APN没有配置,当地信号差… 软件升级…

轻松上云怎么操作?IoT_CLOUD之中移OneNET

​最近来了很多新朋友,也经常被问:可以多讲些云平台的操作吗?当然可以!文末留言你想要了解的云平台,优先安排~ 接下来,本文将以Air780E+LuatOS作为示例,教你使用合宙IoT_CLOUD连接中移OneNET物联网云平台。一、IoT_CLOUD简1.1 IoT_CLOUD特色简介 IoT_CLOUD——是合宙专门…

不容忽视的PCB测试点,关键时刻可以避免批量事故哦!

​PCB测试点是啥子?请看下图:​如果你曾经用过NOKIA手机,每次你打开后盖换电池的时候,每次看到的那两排圆形的点——就是PCB测试点,or you can call it Test Point in English. NOKIA手机的测试点有什么用? 为什么要留这两排测试点? 我虽然不知道NOKIA手机这些测试点的具…

实验2 C语言分支与循环基础应用编程-1

任务一#include <stdio.h> #include <stdlib.h> #include <time.h> #define N 5 #define N1 397 #define N2 476 #define N3 21int main() {int cnt;int random_major, random_no;srand(time(NULL)); // 以当前系统时间作为随机种子cnt = 0;while(cnt &…

面试-前端基础速刷-Vue

1. Vue中computed和watch的区别 两者用途不同啊!computed用于计算产生新的数据,watch用于监听现有数据。 computed有缓存,methods没有缓存。 computed有点儿像工厂模式(产生新的东西),watch像发布订阅模式。(是我目前的知识盲区) 2. Vue组件通讯有几种方式,尽量全面❗…

宝塔平替:1Panel-新一代的 Linux 服务器运维管理面板(附优惠码/推荐码)

什么是1Panel 1Panel是一款开源,现代化的新一代的 Linux 服务器运维管理面板!1Panel可以帮你实现的功能: 高效管理:用户可以通过 Web 图形界面轻松管理 Linux 服务器,实现主机监控、文件管理、数据库管理、容器管理等功能; 快速建站:深度集成开源建站软件 WordPress 和 …

大模型应用开发初探 : 基于Coze创建Agent

Coze(扣子)是字节跳动公司开发的新一代AI应用开发平台,使用这个AI应用开发平台,无论你是否有编码基础,都可以快速搭建基于大语言模型的各类AI Bot,还可以将Bot发布到其他渠道。对于一个AI Agent而言,最重要的能力就是任务规划、调用工具、知识库 和 记忆能力,而这些能力…

了解final关键字在Java并发编程领域的作用吗?

在Java并发编程领域,final关键字扮演着一个至关重要的角色。虽然很多同学熟悉final用于修饰变量、方法和类的基本用法,但其在并发环境中的应用和原理却常常被忽视。final关键字不仅仅是一个简单的修饰符,它在多线程编程中确保对象状态的可见性和不变性,这对于构建线程安全的…

20222325 2024-2025-1 《网络与系统攻防技术》实验一实验报告

1.实验内容缓冲区溢出基本知识:堆栈、函数调用。 shellcode技术以及其在各平台的运用与防御。 BOF攻击防御技术。2.实验目标 本次实践的对象是一个名为pwn1的linux可执行文件。 该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串。 该程序同时包含…

用AI构建小程序可行吗?

AI工具在软件开发中扮演着越来越重要的角色,它可以帮助开发者提高效率、增强软件功能、降低开发门槛。通过合理选择和应用AI工具,可以显著提升软件开发的质量和效率。随着移动互联网的快速发展,多端应用的需求日益增长。为了提高开发效率、降低成本并保证用户体验的一致性,…