Python 异常捕获(详解)

前言:上一篇感觉太多了,应该看完文件和os模块就不太想看最后的异常捕获了,所以这一章单独拿出来写异常捕获,而且里面大部分代码我都有进行详细的解释,各位肯定可以读懂滴拉~~

Python异常

异常的基本概念:

在 Python 中,异常是一种在程序执行过程中出现的错误情况。当程序遇到错误,如除零错误、索引超出范围、文件不存在等情况时,就会引发异常。异常会中断当前的执行流程,除非被捕获并处理,否则程序会终止运行。

异常显示:

异常捕获:

基本语法:

try...except:主要用于捕获代码运行时异常,如果异常发生,则执行except中的代码

python 复制代码
try:
 可能发⽣错误的代码
except:
 如果出现异常执⾏的代码

异常处理的流程:

1.程序首先执行 try 代码块。

2.如果在 try 代码块中没有发生异常,except 代码块不会被执行。

3.如果发生异常,程序会跳转到匹配的 except 代码块,执行相应的异常处理代码。

4.如果没有匹配的 except 代码块,异常会向上传播到调用栈的上一级,直到被捕获或程序终止。

多异常处理:

可以使用多个 except 子句来处理不同类型的异常:

python 复制代码
try:
    num = int("abc")  # 这会引发 ValueError
    result = 10 / num  # 这会引发 ZeroDivisionError
    print(result)
except ValueError:
    print("输入不是有效的数字")
except ZeroDivisionError:
    print("除数不能为零")

捕获多个异常:

可以将多个异常类型放在一个 except 子句中,使用元组:

python 复制代码
try:
    num = int("abc")
    result = 10 / num
    print(result)
except (ValueError, ZeroDivisionError):
    print("输入错误或除数不能为零")

总结:

try-except****语句是 Python 中处理异常的重要工具,它可以帮助你使程序更健壮,避免因未处理的异常而导致程序崩溃。根据可能出现的异常类型和情况,合理地使用 try-except 语句,可以使程序更加可靠,提高用户体验和代码的可维护性。

捕获异常并输出错误信息:

python 复制代码
try:
 可能遇到的错误代码
except Exception as e:
 print(e)

代码实例:

python 复制代码
try:
    # 可能引发异常的代码
    result = 10 / 0  # 这会引发 ZeroDivisionError
except ZeroDivisionError as e:
    # 捕获 ZeroDivisionError 异常并输出错误信息
    print(f"捕获到 ZeroDivisionError 异常:{e}")
except Exception as e:
    # 捕获其他未被特定处理的异常
    print(f"捕获到其他异常:{e}")

代码解释:

  1. try 块

    • 包含可能会引发异常的代码。在上述示例中,10 / 0 会导致 ZeroDivisionError 异常,因为除数不能为零。
  2. except ZeroDivisionError as e

    • 这部分用于专门捕获 ZeroDivisionError 异常。
    • as e 允许将异常对象存储在变量 e 中,以便在异常处理代码中使用。
    • 打印出 ZeroDivisionError 异常的具体信息,包括异常类型和异常消息。
  3. except Exception as e

    • 这是一个通用的异常捕获语句,用于捕获其他未被特定处理的异常。
    • Exception 是所有内置异常的基类,因此它可以捕获除 ZeroDivisionError 以外的其他异常。
    • 同样,as e 存储异常对象,以便打印异常信息。

异常捕获中else语句:

else语句:表示的是如果没有异常要执行的代码。

基本结构:

python 复制代码
try:
    # 可能引发异常的代码块
except SomeException:
    # 当发生 SomeException 异常时执行的代码块
else:
    # 当 try 代码块中没有发生异常时执行的代码块

代码实例:

python 复制代码
try:
    result = 10 / 2  # 正常的除法运算
except ZeroDivisionError:
    print("除数不能为零")
else:
    print(f"结果是: {result}")

代码解释

  • try 代码块
    • 包含可能引发异常的代码。在这个例子中,10 / 2 是一个正常的除法运算,不会引发异常。
  • except ZeroDivisionError
    • 用于捕获 ZeroDivisionError 异常。由于 try 代码块中没有发生该异常,所以不会执行此代码块。
  • else 代码块
    • try 代码块中没有发生异常时,执行此代码块。在这里,会打印出除法运算的结果。

异常捕获中finally语句:

基本概念: 在 Python 的异常处理机制中,finally 子句是一个非常重要的部分,它的主要作用是确保无论 try 块中的代码是否引发异常,其中的代码都会被执行。

基本结构:

python 复制代码
try:
    # 可能引发异常的代码块
except SomeException:
    # 当发生 SomeException 异常时执行的代码块
else:
    # 当 try 代码块中没有发生异常时执行的代码块
finally:
    # 无论是否发生异常都会执行的代码块

代码实例:

python 复制代码
def divide(x, y):
    try:
        result = x / y
        print(f"结果是: {result}")
    except ZeroDivisionError:
        print("除数不能为零")
    finally:
        print("这是 finally 子句,总是会执行")


# 调用函数
divide(10, 2)
divide(10, 0)

代码解释

  • try 代码块
    • 包含可能引发异常的代码。在 divide(10, 2) 中,执行正常的除法运算,在 divide(10, 0) 中,会引发 ZeroDivisionError
  • except ZeroDivisionError
    • 当发生 ZeroDivisionError 异常时,会打印相应的错误信息。
  • finally 代码块
    • 无论是否发生异常,都会打印 "这是 finally 子句,总是会执行"

总结finally的作用:

finally 通常用于释放资源,如关闭文件、关闭数据库连接、释放锁等,确保资源在使用后被正确释放,避免资源泄漏。

即使 try 块中引发了异常或 except 块中引发了新的异常,finally 块中的资源清理代码仍然会执行。

异常传播

如果 finally 块中引发了异常,它会覆盖 tryexcept 块中引发的异常。 在 finally 块中引发异常时要谨慎,避免掩盖了原有的异常。

使用 finally 子句可以确保重要的操作(如资源清理)在任何情况下都能完成,提高代码的健壮性和可靠性,特别是在涉及资源管理时非常有用。

finally语句与else语句的区别:

else 子句

只有在 try 块中没有发生异常时才会执行。

主要用于在没有异常发生时执行正常的操作,使正常操作和异常处理分离。

finally 子句

无论是否发生异常都会执行。

侧重于资源清理和保证某些操作的最终执行。

结:对于异常捕获的详细解释就到这里拉,如果有问题的话,再后面还会有补充的

相关推荐
爱python的王三金4 分钟前
【数据分析实战】马来西亚吉隆坡景点评论分析:多维度游客体验与运营优化洞察
大数据·python·nlp·数据可视化
猿猴一号(lxd)13 分钟前
java根据模板导出word,并在word中插入echarts相关统计图片以及表格
java·word·echarts
Loving_enjoy18 分钟前
Python|【Pytorch】基于小波时频图与SwinTransformer的轴承故障诊断研究
pytorch·python
小桑要读研23 分钟前
二级缓存(缓存到Redis)
java·开发语言·spring
哟哟耶耶24 分钟前
improve-gantt-elastic(vue2中甘特图实现与引入)
前端·甘特图
程序员二.黑25 分钟前
接口自动化入门 : Http的请求头,请求体,响应码解忻!
运维·软件测试·python·测试工具·http·自动化
晴子呀35 分钟前
单例模式的几种实现方式
java·开发语言
maply42 分钟前
npm 方式安装Pyodide 详解
前端·python·npm·node.js·pyodide
脸红ฅฅ*的思春期43 分钟前
JAVA安全—JWT攻防&Swagger自动化&Druid泄露
java·安全·自动化·jwt
三劫散仙44 分钟前
conda 依赖固定和 pip 依赖使用的区别
python·conda·pip