23. 异常处理机制

news2024/9/21 17:27:11

1. 异常

即便 python 程序的语法是正确的,在运行它的时候,也有可能发生错误。运行期检测到的错误被称为异常。

# int不能与str相加, 触发异常
print(2+'2')
# 0 不能作为除数, 触发异常
print(1/0)
# sum未定义, 触发异常
print(num)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

异常以不同的类型出现,这些类型都作为信息的一部分打印出来: 例子中的类型有 ZeroDivisionError,NameError 和 TypeError。

2. try…except…

(1) 异常捕捉可以使用 try…except…语句

# 先看一个案例.
# 因为无法转换成int型数据, 所以抛出异常, 程序直接终止.
# 如果加上异常处理, 那么程序便不会由异常的产生而终止, 而是继续执行, 见下面案例.
print(int('2ss'))
print('HelloWorld')
# 让用户输入一个合法的整数, 如果输入的无法进行无法转换成int型数据, 那么将抛出异常ValueError,
# 此异常被捕获. 由于我们做了异常处理, 所以即使发生异常, 程序也不会直接退出.
while True:
    try:
        value = int(input("please input a number:> "))
        break
    except ValueError:
        print("occur error.")

在这里插入图片描述
(2) try…except…的工作流程
try语句按照如下方式工作:
  首先,执行try子句(在关键字try和关键字except之间的语句);
  如果没有异常发生,忽略except子句,try子句执行后继续其他代码的执行;
  如果在执行try子句的过程中发生了异常,那么try子句余下的部分将被不会被执行
  如果异常的类型和except之后的名称相符,那么对应的except子句将被执行;
  如果一个异常没有与任何的except匹配,那么这个异常将会传递给上层的try中;
(3) 多异常处理
一个 try语句可能包含多个except子句分别来处理不同的特定的异常。最多只有一个分支会被执行。
处理程序将只针对对应的try子句中的异常进行处理,而不是其他的try的处理程序中的异常。

一个except子句可以同时处理多个异常,这些异常将被放在一个括号里成为一个元组

except (RuntimeError, TypeError, NameError):
    pass

最后一个except子句可以忽略异常的名称,它将被当作通配符使用(可以捕获所有异常)。你可以使用这种方法打印一个错误信息,然后再次把异常抛出。

# 试图打开一个不存在的文件, 将触发OSError异常.
import sys
try:
    file = open("report.txt")
    context = file.readline()
    i = int(context.strip())
except OSError as err:
    print("OS error: {0}.".format(err))
except ValueError:
    print("Could not convert data to an integer.")
except:
    print("Unexpected  error:", sys.exc_info())
    raise

3. try…except…else…

try…except… 语句还有一个可选的else子句,如果使用这个子句,那么必须放在所有的except子句之后else子句将在try子句没有发生任何异常的时候执行。
在这里插入图片描述

# else子句将在没有任何异常发生时执行.
def fail(code):
    if(code):
        return 1/1
    else:
        return 1/0

try:
    fail(1)
    #fail(0)
except ZeroDivisionError as err:
    print('handle run-time error:> ', err)
else:
    print('no error.')

在这里插入图片描述

4. try-finally…

try-finally 语句无论是否发生异常都将执行最后的代码
在这里插入图片描述

# 即使发生了异常, finally子句也会被执行.
def fail(code):
    if(code):
        return 1/1
    else:
        return 1/0

try:
    fail(0)
except ZeroDivisionError as err:
    print('handle run-time error:> ', err)
else:
    print('no error.')
finally:
    print("不管有无异常, 都会被执行.")

在这里插入图片描述

5. 抛出异常raise

python 使用 raise 语句抛出一个指定的异常。
raise语法格式如下:raise [Exception [, args [, traceback]]]*

# 以下案例将抛出异常. 
x = 10
if x > 5:
    raise Exception("x不能大于5.")

在这里插入图片描述
raise 唯一的一个参数指定了要被抛出的异常。它必须是一个异常的实例或者是异常的类(也就是 Exception 的子类)。
如果你只想知道这是否抛出了一个异常,并不想去处理它,那么一个简单的 raise 语句就可以再次把它抛出

try:
    raise NameError('抛出异常.')
except NameError:
    print('截获异常.')
    raise

6. 自定义异常

可以通过创建一个新的异常类来拥有自己的异常。异常类继承自 Exception 类,可以直接继承,或者间接继承。

# 自定义异常类MyError, 继承自Expection类.
class MyError(Exception):
    def __init__(self, value):
        self.value = value

    def __str__(self):
        return repr(self.value)


try:
    raise MyError(2 * 2)
except MyError as error:
    print('My Exception occurred, code is:> ', error.value)

在这里插入图片描述

7. with关键字

python 中的 with 语句用于异常处理,封装了 try…except…finally… 编码范式,提高了易用性。
with 语句使代码更清晰、更具可读性, 它简化了文件流等公共资源的管理。
在处理文件对象时使用 with 关键字是一种很好的做法
接下来看一个案例分析:>

# 1.
# 不使用 with,也不使用 try…except…finally.
# 以上代码如果在调用write()的过程中出现了异常, 则close()方法将无法被执行.
# 因此资源就会一直被该程序占用而无法被释放.
file = open('./temp.txt', 'w')
file.write('hello world !')
file.close()
# 2.
# 接下来使用 try…except…finally…来改进代码.
# 以上代码我们对可能发生异常的代码处进行try捕获, 发生异常时执行except代码块,
# finally代码块是无论什么情况都会执行,所以文件会被关闭,不会因为执行异常而占用资源.
# Notice: [except:] 后面没有跟异常名, 是一个通配符, 表示捕获所有异常.
file = open('./temp.txt', 'w')
try:
    file.write('hello world !')
except:		# 表示捕获所有异常
	...
finally:
    file.close()
# 3.
# 最后使用with关键字.
# 使用with关键字系统会自动调用f.close()方法, with的作用等效于try/finally语句是一样的.
with open('./temp.txt', 'w') as file:
    file.write('hello world !')

with语句原理:
with 语句实现原理建立在上下文管理器之上。
上下文管理器是一个实现 enterexit 方法的类。
使用 with 语句确保在嵌套块的末尾调用 exit 方法。
这个概念类似于 try…finally 块的使用。

with open('./temp.txt', 'w') as my_file:
    my_file.write('hello world !')

以上实例将 hello world! 写到 ./temp.txt 文件中去。
在文件对象中定义了 __enter____exit__ 方法,即文件对象也实现了上下文管理器,首先调用 __enter__ 方法,然后执行 with 语句中的代码,最后调用 __exit__ 方法。 即使出现错误,也会调用 __exit__ 方法,也就是会关闭文件流。

8. assert断言

python assert(断言)用于判断一个表达式,在表达式条件为 false 的时候触发异常
断言可以在条件不满足程序运行的情况下直接返回错误,而不必等待程序运行后出现崩溃的情况,例如我们的代码只能在 Linux 系统下运行,可以先判断当前系统是否符合条件。


num = 5
assert num > 5      # num必须大于5, 否则触发异常

在这里插入图片描述


以下实例判断当前系统是否为 Linux,如果不满足条件则直接触发异常,不必执行接下来的代码:

import sys
assert ('linux' in sys.platform), "该代码只能在 Linux 下执行"

print("HelloWorld.")
print("HelloWorld.")
print("HelloWorld.")

在这里插入图片描述

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

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

相关文章

【JavaSE专栏4】关键字、标识符和命名规范

作者主页:Designer 小郑 作者简介:Java全栈软件工程师一枚,来自浙江宁波,负责开发管理公司OA项目,专注软件前后端开发(Vue、SpringBoot和微信小程序)、系统定制、远程技术指导。CSDN学院、蓝桥云…

k8s部署elk+filebeat。springCloud集成elk+filebeat+kafka+zipkin实现多个服务日志链路追踪聚合到es

一、目的 如今2023了,大多数javaweb架构都是springboot微服务,一个前端功能请求后台可能是多个不同的服务共同协做完成的。例如用户下单功能,js转发到后台网关gateway服务,然后到鉴权spring-sercurity服务,然后到业务…

mysql数据库管理-GTID详解

一、GTID概述 1 sql线程执行的事件也可以通过log_slave_updates系统变量来决定是否写入自己的二进制文件中,这是可以用于级联复制的场景。 GTID是MYSQL5.6新增的特性,GTID(Global Transaction Identifier)全称为全局事务标示符…

17种编程语言实现排序算法-计数排序

开源地址 https://gitee.com/lblbc/simple-works/tree/master/sort/ 覆盖语言:C、C、C#、Java、Kotlin、Dart、Go、JavaScript(JS)、TypeScript(TS)、ArkTS、swift、PHP。 覆盖平台:安卓(Java、Kotlin)、iOS(SwiftUI)、Flutter(Dart)、Window桌面(C#)、…

力扣sql简单篇练习(五)

力扣sql简单篇练习(五) 1 游戏玩法分析 I 1.1 题目内容 1.1.1 基本题目信息 1.1.2 示例输入输出 1.2 示例sql语句 # 第一次登录平台的日期就代表是时间靠前的日期 # 窗口函数是Mysql8版本后才能使用 SELECT e.player_id,e.event_date first_login FROM (SELECT player_id,e…

五、python-地图可视化篇(黑马程序猿-python学习记录)

黑马程序猿的python学习视频:https://www.bilibili.com/video/BV1qW4y1a7fU/ 目录 1. 基础地图 2. 设置分段 1. 基础地图 from pyecharts.charts import Map # 准备地图对象 map Map() # 准备数据 data[ ("北京",99), ("上海",199), ("…

17种编程语言实现排序算法-堆排序

开源地址 https://gitee.com/lblbc/simple-works/tree/master/sort/ 覆盖语言:C、C、C#、Java、Kotlin、Dart、Go、JavaScript(JS)、TypeScript(TS)、ArkTS、swift、PHP。 覆盖平台:安卓(Java、Kotlin)、iOS(SwiftUI)、Flutter(Dart)、Window桌面(C#)、…

Maplab 2.0发布:多传感器融合的SLAM框架,支持多机器人、语义回环检测功能

摘要 将多种传感器和深度学习集成到SLAM系统中是当前研究的重要领域。多模态是一块跳板,既可以在挑战场景下增强鲁棒性,又可以解决不同传感器配置的多机系统建图问题。Maplab 2.0提供了一个更加通用的开源平台,最初的Maplab用于创建和管理视…

5-3中央处理器-数据通路的功能和基本结构

文章目录一.功能二.基本结构三.数据流向(一)内部单总线方式1.寄存器之间的数据传送2.主存与CPU之间的数据传送3.执行算术或逻辑运算(二)专用数据通路方式一.功能 数据在功能部件之间传送的路径称为数据通路。路径上的部件称为数据…

合宙ESP32C3上手使用

概述经典款是有ch343 ttl 转usb 需要安装驱动 GPIO20/21新款使用usb 直连不需要驱动 USB GPIO18/19ESP32C3 是ESP-RISC-V CPU 是基于 RISC-V ISA 的 32 位内核,包括基本整数 (I),乘法/除法 (M) 和压缩 (C) 标准扩展。ESP-RISC-V CPU 内核具有 4 级有序标…

【蓝桥杯】简单数论1——GCDLCM

GCD 最大公约数Greatest Common Divisor(GCD):整数a和b的GCD是指能同时整除a和b的最大整数,记为gcd(a,b)。由于-a的因子和a的因子相同,因此gcd(a, b) gcd(al, |bl)。编码时只关注正整数的最大公约数。 GCD性质 (1) gcd(a, b) gcd(a, ab) …

一、python准备工作篇(黑马程序猿-python学习记录)

黑马程序猿的python学习视频:https://www.bilibili.com/video/BV1qW4y1a7fU/ 目录 1. python官网 2. 检查是否安装完毕 3. pycharm官网 5. phcharm更换主题 6. 新建第一个python文件 7. pycharm字体大小设置 8. 设置快捷键 设置字体大小 ​​​​​​​9. 安装中文…

Python机器学习:假设检验

方差分析这部分内容还不是很理解,在这里先做一个笔记,以后有时间再回过头来改一改。 用到的数据集→\rightarrow→Iris 什么是假设检验? 假设检验就是利用样本数据对某个事先做出的统计假设,再按照某种方法去检验,最后…

CSS样式基础内容2

目录 Emmet语法 快速格式化代码 CSS的复合选择器 后代选择器 子选择器 并集选择器 伪类选择器 链接伪类选择器 focus伪类选择器 CSS元素显示模式 块元素 行内元素 行内块元素 元素显示模式转换 案例-简洁版侧边栏 单行文字垂直居中 CSS的背景 背景图片 方位名词…

【蓝桥云课】最大公约数与最小公倍数

一、最大公约数gcd(a,b) 引例: a24,其因子有1、2、3、4、6、8、12、24 b15,其因子有1、3、5、15 最大公约数gcd(a,b)gcd(24,15)3 欧几里得辗转算法: a max(a,b); b min(a,b); while(b>0){t a%b;a b;b t; }运算过程&…

postgresql源码学习(53)—— vacuum②-lazy vacuum之heap_vacuum_rel函数

一、 table_relation_vacuum函数 1. 函数定义 前篇最后(https://blog.csdn.net/Hehuyi_In/article/details/128749517),我们提到了table_relation_vacuum函数(tableam.h文件),本篇继续学习。 如前面所说&a…

人大金仓数据库对象访问权限

数据库的表、索引、视图等,在数据库中的一切都可以称为数据库对象。 对象分为以下两类 模式(SCHEMA)对象:可视为一个表的集合,可以理解为一个存储目录,包含视图、索引、数据类型、函数和操作符等。非模式…

AcWing1229.日期问题——学习笔记

目录 题目 代码 AC结果 思路: 一、获取数据 二、验证日期合法性 三、去重 四、排序 五、主方法中调用&输出 题目 1229. 日期问题 - AcWing题库https://www.acwing.com/problem/content/description/1231/ 代码 import java.util.Scanner;public class…

XILINX FPGA OV5640 摄像头驱动(一)

影像行业是一个值得深耕的方向,废话不多说 先看输入和输出 输入是光照,输出是光照的数字信号 image area:说的是感光矩阵,CMOS图像传感器的最核心部分,接收光照产生电信号的部分。决定了图像质量的好坏 矩阵就会行列…

MyBatisPlus笔记

一、MyBatisPlus概述 MyBatisPlus(简称 MP)是一个MyBatis的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。 MyBatis-Plus可以节省我们大量工作时间,所有的CRUD代码它都可以自动化完成&…