当前位置: 首页 > article >正文

Python 异常捕获(详解)

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

Python异常

异常的基本概念:

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

异常显示:3c7438e7345642fab49fd2a709435144.png

异常捕获:

基本语法:

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

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

异常处理的流程:

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

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

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

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

 

多异常处理:

 

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

 

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

捕获多个异常:

 

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

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

总结:

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

 

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

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

代码实例:

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语句:表示的是如果没有异常要执行的代码。

        基本结构:

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

        代码实例:

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

代码解释

 

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

异常捕获中finally语句:

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

基本结构:

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

代码实例:

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 块中引发了异常,它会覆盖 try 或 except 块中引发的异常。                            在 finally 块中引发异常时要谨慎,避免掩盖了原有的异常。

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

finally语句与else语句的区别:

else 子句

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

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

finally 子句

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

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

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

 


http://www.kler.cn/a/504977.html

相关文章:

  • JAVA安全—JWT攻防Swagger自动化Druid泄露
  • candb++ windows11运行报错,找不到mfc140.dll
  • (STM32笔记)十二、DMA的基础知识与用法 第二部分
  • fastadmin插件wanlshop使用方法
  • RV1126+FFMPEG推流项目(3)VI模块视频编码流程
  • STM32特殊功能引脚详解文章·STM32特殊功能引脚能当作GPIO使用嘛详解!!!
  • 鸿蒙学习基础环境搭建、基本的语法、以及构建视图的基本语法(一)
  • flathub vscode
  • ASP.NET Core - 依赖注入(四)
  • 通过外部化 `config.properties` 文件更换数据库配置
  • 《无锡布里渊分布式光纤传感技术:照亮能源领域新征程》
  • PyTorch框架——基于深度学习YOLOv11神经网络路面坑洞检测系统
  • 数据库增量备份和全量备份
  • Vue脚手架开发 Vue2基础 VueRouter的基本使用 vue-router路由案例
  • 32单片机从入门到精通之安全性与可靠性——错误检测(十七)
  • cursor+deepseek构建自己的AI编程助手
  • exclude配置项详解
  • 【MySQL】mysql数据目录
  • 数据结构——概述
  • 论文略读:ASurvey of Large Language Models for Graphs
  • Redis 知识速览
  • Qiskit快速编程探索(进阶篇)
  • 计算机网络 (44)电子邮件
  • 北邮团队在Nature Medicine发表MedFound——辅助疾病诊断的通用医学语言模型|顶刊速递·25-01-15
  • npx和npm区别
  • 【Linux 36】多路转接 - epoll