第八章:Python异常处理(python 异常处理方法)
wptr33 2025-06-23 22:40 2 浏览
8.1 异常基础
8.1.1 理论知识
在程序运行过程中,可能会遇到各种错误,这些错误被称为异常。异常会导致程序的正常执行流程被中断。Python提供了异常处理机制,允许我们捕获并处理这些异常,使程序在遇到错误时能够更加健壮,避免崩溃。
常见的异常类型有很多,例如 ZeroDivisionError(除零错误)、FileNotFoundError(文件未找到错误)、TypeError(类型错误)等。
8.1.2 示例代码
try:
result = 10 / 0
print(result)
except ZeroDivisionError:
print("不能除以零")
8.1.3 代码解释
- 在 try 块中,尝试执行 10 / 0 这一操作,该操作会引发 ZeroDivisionError 异常。
- 当异常发生时,程序不会崩溃,而是跳转到 except 块中执行相应的代码,即打印“不能除以零”。如果没有 try - except 结构,程序会因除零错误而终止并抛出异常信息。
8.2 捕获多种异常
8.2.1 理论知识
一个 try 块可能会引发多种不同类型的异常,我们可以使用多个 except 块来分别捕获不同类型的异常,并进行针对性的处理。
8.2.2 示例代码
try:
num1 = "10"
num2 = 2
result = num1 + num2
print(result)
another_result = 10 / 0
except TypeError:
print("类型错误,无法进行该操作")
except ZeroDivisionError:
print("不能除以零")
8.2.3 代码解释
- 在 try 块中,首先尝试将字符串 num1 和整数 num2 相加,这会引发 TypeError 异常。即使后续还有可能引发 ZeroDivisionError 的代码,但由于前面已经引发了 TypeError,程序会直接跳转到对应的 except TypeError 块,打印“类型错误,无法进行该操作”。如果 try 块中没有 TypeError,才会继续执行后面的代码,若遇到除零操作引发 ZeroDivisionError,则会执行 except ZeroDivisionError 块中的代码。
8.3 使用一个 except捕获多种异常
8.3.1 理论知识
可以在一个 except 语句中同时捕获多种异常类型,将这些异常类型放在一个元组中。
8.3.2 示例代码
try:
num1 = "10"
num2 = 2
result = num1 + num2
print(result)
another_result = 10 / 0
except (TypeError, ZeroDivisionError):
print("发生了类型错误或除零错误")
8.3.3 代码解释
- try 块中的代码与前面示例类似,可能引发 TypeError 或 ZeroDivisionError。
- 这里使用一个 except 块,通过将两种异常类型 TypeError 和 ZeroDivisionError 放在元组 (TypeError, ZeroDivisionError) 中来捕获这两种异常。无论引发哪种异常,都会执行该 except 块中的代码,打印“发生了类型错误或除零错误”。
8.4 获取异常信息
8.4.1 理论知识
有时候,我们不仅想知道发生了什么类型的异常,还想获取异常的具体信息。可以在 except 语句中使用 as 关键字来获取异常对象,通过该对象可以访问异常的详细信息。
8.4.2 示例代码
try:
with open('nonexistent_file.txt', 'r') as file:
content = file.read()
except FileNotFoundError as e:
print(f"文件未找到,异常信息: {e}")
8.4.3 代码解释
- 在 try 块中,尝试打开一个不存在的文件 nonexistent_file.txt,这会引发 FileNotFoundError 异常。
- 在 except 块中,使用 as e 将异常对象赋值给变量 e,然后通过 e 打印出异常的详细信息,例如“[Errno 2] No such file or directory: 'nonexistent_file.txt'”,这样能更清楚地了解异常发生的原因。
8.5 else子句
8.5.1 理论知识
try - except 结构可以包含一个 else 子句。当 try 块中没有引发任何异常时,会执行 else 子句中的代码。
8.5.2 示例代码
try:
num1 = 10
num2 = 2
result = num1 / num2
except ZeroDivisionError:
print("不能除以零")
else:
print(f"除法结果: {result}")
8.5.3 代码解释
- 在 try 块中进行除法运算 num1 / num2。如果没有发生 ZeroDivisionError 异常,程序会跳过 except 块,执行 else 块中的代码,即打印除法的结果。如果 try 块中引发了 ZeroDivisionError 异常,except 块会捕获并处理异常,else 块不会执行。
8.6 finally子句
8.6.1 理论知识
finally 子句无论 try 块中是否发生异常,都会执行。通常用于执行一些清理操作,如关闭文件、释放资源等。
8.6.2 示例代码
file = None
try:
file = open('test.txt', 'w')
file.write('一些测试内容')
except Exception as e:
print(f"发生异常: {e}")
finally:
if file:
file.close()
print("文件已关闭")
8.6.3 代码解释
- 在 try 块中,尝试打开一个文件 test.txt 并写入内容。如果在这个过程中发生异常,except 块会捕获并打印异常信息。
- 无论 try 块中是否发生异常,finally 块都会执行。这里检查 file 是否为 None(即文件是否成功打开),如果是则关闭文件并打印“文件已关闭”,确保文件资源得到正确释放。
8.7 自定义异常
8.7.1 理论知识
除了Python内置的异常类型,我们还可以定义自己的异常类。自定义异常类通常继承自内置的 Exception 类或其子类。通过自定义异常,可以在程序中根据特定的业务逻辑抛出有针对性的异常,使代码更易读和维护。
8.7.2 示例代码
class NegativeNumberError(Exception):
pass
def calculate_square_root(num):
if num < 0:
raise NegativeNumberError("不能计算负数的平方根")
import math
return math.sqrt(num)
try:
result = calculate_square_root(-4)
print(result)
except NegativeNumberError as e:
print(e)
8.7.3 代码解释
- 定义了一个自定义异常类 NegativeNumberError,它继承自 Exception 类。
- 在 calculate_square_root 函数中,如果传入的数字为负数,就使用 raise 关键字抛出 NegativeNumberError 异常,并附带错误信息。
- 在 try - except 块中调用 calculate_square_root(-4),由于传入负数,会引发自定义异常,except 块捕获该异常并打印异常信息“不能计算负数的平方根”。
相关推荐
- 十年之重修Redis原理(redis重试机制)
-
弱小和无知并不是生存的障碍,傲慢才是。--------面试者...
- Redis 中ZSET数据类型命令使用及对应场景总结
-
1.zadd添加元素zaddkeyscoremember...
- redis总结(redis常用)
-
RedisTemplate封装的工具类packagehk.com.easyview.common.helper;importcom.alibaba.fastjson.JSONObject;...
- 配置热更新系统(如何实现热更新)
-
整体设计概览┌────────────┐┌────────────────┐┌────────────┐│配置后台服务│--写入-->│Red...
- java高级用法之:调用本地方法的利器JNA
-
简介JAVA是可以调用本地方法的,官方提供的调用方式叫做JNI,全称叫做javanativeinterface。要想使用JNI,我们需要在JAVA代码中定义native方法,然后通过javah命令...
- SpringBoot:如何优雅地进行响应数据封装、异常处理
-
背景越来越多的项目开始基于前后端分离的模式进行开发,这对后端接口的报文格式便有了一定的要求。通常,我们会采用JSON格式作为前后端交换数据格式,从而减少沟通成本等。...
- Java中有了基本类型为什么还要有包装类型(封装类型)
-
Java中基本数据类型与包装类型有:...
- java面向对象三大特性:封装、继承、多态——举例说明(转载)
-
概念封装:封装就是将客观的事物抽象成类,类中存在属于这个类的属性和方法。...
- java 面向对象编程:封装、继承、多态
-
Java中的封装(Encapsulation)、继承(Inheritance)和多态(Polymorphism)是面向对象编程的三大基本概念。它们有助于提高代码的可重用性、可扩展性和可维护性。...
- 怎样解析java中的封装(怎样解析java中的封装文件)
-
1.解析java中的封装1.1以生活中的例子为例,打开电视机的时候你只需要按下开关键,电视机就会打开,我们通过这个操作我们可以去间接的对电视机里面的元器件进行亮屏和显示界面操作,具体怎么实现我们并不...
- python 示例代码(python代码详解)
-
以下是35个python代码示例,涵盖了从基础到高级的各种应用场景。这些示例旨在帮助你学习和理解python编程的各个方面。1.Hello,World!#python...
- python 进阶突破——内置模块(Standard Library)
-
Python提供了丰富的内置模块(StandardLibrary),无需安装即可直接使用。以下是一些常用的内置模块及其主要功能:1.文件与系统操作...
- Python程序员如何调试和分析Python脚本程序?附代码实现
-
调试和分析Python脚本程序调试技术和分析技术在Python开发中发挥着重要作用。调试器可以设置条件断点,帮助程序员分析所有代码。而分析器可以运行程序,并提供运行时的详细信息,同时也能找出程序中的性...
- python中,函数和方法异同点(python方法和函数的区别)
-
在Python中,函数(Function)...
- Python入门基础命令详解(python基础入门教程)
-
以下是Python基本命令的详解指南,专为初学者设计,涵盖基础语法、常用操作和实用示例:Python基本命令详解:入门必备指南1.Python简介特点:简洁易读、跨平台、丰富的库支持...
- 一周热门
-
-
C# 13 和 .NET 9 全知道 :13 使用 ASP.NET Core 构建网站 (1)
-
因果推断Matching方式实现代码 因果推断模型
-
git pull命令使用实例 git pull--rebase
-
面试官:git pull是哪两个指令的组合?
-
git 执行pull错误如何撤销 git pull fail
-
git fetch 和git pull 的异同 git中fetch和pull的区别
-
git pull 和git fetch 命令分别有什么作用?二者有什么区别?
-
git pull 之后本地代码被覆盖 解决方案
-
还可以这样玩?Git基本原理及各种骚操作,涨知识了
-
git命令之pull git.pull
-
- 最近发表
- 标签列表
-
- git pull (33)
- git fetch (35)
- mysql insert (35)
- mysql distinct (37)
- concat_ws (36)
- java continue (36)
- jenkins官网 (37)
- mysql 子查询 (37)
- python元组 (33)
- mybatis 分页 (35)
- vba split (37)
- redis watch (34)
- python list sort (37)
- nvarchar2 (34)
- mysql not null (36)
- hmset (35)
- python telnet (35)
- python readlines() 方法 (36)
- munmap (35)
- docker network create (35)
- redis 集合 (37)
- python sftp (37)
- setpriority (34)
- c语言 switch (34)
- git commit (34)