本篇是 Python 系列教程第 17 篇,更多内容敬请访问我的 Python 合集

当我们编写代码时,可能会遇到各种各样的错误情况,比如除数为零、找不到文件、网络问题等等。为了优雅地处理这些问题,Python 提供了异常处理机制。

1 异常处理的基本结构

Python 中的异常处理主要依赖于 tryexcept 语句。基本的结构如下:

try:
# 尝试执行的代码块
some_code()
except SomeException as e:
# 如果在 try 块中引发了指定类型的异常,则执行此代码块
print(f"An error occurred: {e}")

2 异常处理的组成部分

  1. try 块:这部分包含了你希望监控的可能引发异常的代码。

  2. except 块:如果在 try 块中引发了异常,那么会跳转到 except 块中执行。

    • 可以指定特定类型的异常来捕获,也可以不指定类型来捕获所有异常。
    • 如果指定了异常类型,还可以获取异常对象来处理。
  3. else 块(可选):如果没有异常发生,则执行 else 块中的代码。

  4. finally 块(可选):无论是否发生异常都会执行 finally 块中的代码,通常用于释放资源,如关闭文件或清理操作。

2.1 示例

下面是一个简单的异常处理示例:

try:
# 这里尝试打开一个不存在的文件,会抛出 FileNotFoundError
with open("nonexistentfile.txt", "r") as file:
content = file.read()
print(content)
except FileNotFoundError as fnf_error:
# 处理 FileNotFoundError 异常
print(f"未找到文件: {fnf_error}")
else:
# 如果没有异常发生,则打印文件内容
print("文件被读取")
finally:
# 无论是否有异常,都会执行这里
print("无论是否出现异常,都会打印出来。")

3 多个 except 块

你可以有多个 except 块来分别处理不同类型的异常:

try:
# 可能引发多种类型的异常
x = 1 / 0 # ZeroDivisionError
y = "hello" + 5 # TypeError
except ZeroDivisionError as zde:
print(f"Cannot divide by zero: {zde}")
except TypeError as te:
print(f"Type error occurred: {te}")

4 自定义异常

自定义异常通常是通过继承Python内置的异常类(如Exception或更具体的异常类)来实现的。抛出异常是用raise关键字实现的。

你还可以定义自己的异常类,然后在代码中抛出它们:

class CustomError(Exception):
pass
class MyError(CustomError):
pass try:
raise MyError("This is a custom error message.")
except MyError as e:
print(f"捕获自定义MyError异常:{e}")
except CustomError as e:
print(f"捕获自定义CustomError异常:{e}")

注意捕获异常的顺序是从上到下,当执行到第8行时,判断抛出的异常是否为MyError异常或其子类,若成立则执行第9行,后面的10、11行不再执行。

那如果把两个捕获异常的代码调换一下顺序呢?如下:

class CustomError(Exception):
pass
class MyError(CustomError):
pass try:
raise MyError("This is a custom error message.")
except CustomError as e:
print(f"捕获自定义CustomError异常:{e}")
except MyError as e:
print(f"捕获自定义MyError异常:{e}")

结果也是执行第9行,后面的10、11行不执行。虽然下面的MyError更精确,但代码执行到第8行时判断异常是CustomError或其子类成立,所以执行了第9行。

4.1 默认的异常消息

当raise异常不指定异常消息时,可以定义一个默认的消息

class MyError(Exception):
def __init__(self, message="当抛出的消息为空时的默认消息"):
super().__init__(message)
pass try:
raise MyError()
except MyError as e:
print(f"捕获自定义MyError异常:{e}") try:
raise MyError("报错啦啦啦啦")
except MyError as e:
print(f"捕获自定义MyError异常:{e}")

打印

捕获自定义MyError异常:当抛出的消息为空时的默认消息
捕获自定义MyError异常:报错啦啦啦啦

17 Python异常处理(捕获异常、抛出异常、自定义异常)的更多相关文章

  1. Python学习(17)异常处理

    目录 Python 异常处理 Python 标准异常 异常处理 使用except而不带任何异常类型 使用except而带多种异常类型 try-finally 语句 异常参数 异常的参数 用户自定义参数 ...

  2. python异常处理try,except,else,finally,raise

    先看下else的使用: try: ... exception: ... else: ... 只有在try中没有发生任何异常,所有代码完全成功的情况下才会转入else 再看下finally: final ...

  3. python异常处理的哲学

    所谓异常指的是程序的执行出现了非预期行为,就好比现实中的做一件事过程中总会出现一些意外的事.异常的处理是跨越编程语言的,和具体的编程细节相比,程序执行异常的处理更像是哲学.限于认知能力和经验所限,不可 ...

  4. Python 异常处理

    Python 异常处理 python提供了两个非常重要的功能来处理python程序在运行中出现的异常和错误.你可以使用该功能来调试python程序. 异常处理: 本站Python教程会具体介绍. 断言 ...

  5. Python异常处理总结

    一.何谓异常处理 在我们调试程序时,经常不可避免地出现意料之外的情况,导致程序不得不停止运行,然后提示大堆提示信息,大多是这种情况都是由异常引起的.异常的出现一方面是因为写代码时粗心导致的语法错误,这 ...

  6. python 异常处理函数--raise

    Python 异常处理--raise函数用法 在Python中,要想引发异常,最简单的形式就是输入关键字raise,后跟要引发的异常的名称.异常名称标识出具体的类: Python异常处理是那些类的对象 ...

  7. Python异常处理回顾与总结

    1 引言 在我们调试程序时,经常不可避免地出现意料之外的情况,导致程序不得不停止运行,然后提示大堆提示信息,大多是这种情况都是由异常引起的.异常的出现一方面是因为写代码时粗心导致的语法错误,这种错误在 ...

  8. Python异常处理与上下文管理器

    Python异常处理 异常与错误 错误 可以通过IDE或者解释器给出提示的错误opentxt('a.jpg','r') 语法层面没有问题,但是自己代码的逻辑有问题if age>18: print ...

  9. python 异常处理(25)

    在python开发中,代码书写时难免有疏忽或者意向不到的bug,导致程序run的过程中有可能会直接崩溃:然后对于程序猿而言,程序因bug崩溃是家常便饭,为了增加程序的健壮性,防止程序崩溃,我们可以对程 ...

  10. Python 异常处理与反射机制

    Python 的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为ABC语言的一种继承.Py ...

随机推荐

  1. mac 安装homebrew 报443

    描述 macOS安装Homebrew时总是报错(Failed to connect to raw.githubusercontent.com port 443: Connection refused) ...

  2. 重磅集结!CNCF/VMware/PingCAP/网易数帆/阿里云联合出品云原生生态大会

    "云原生(Cloud Native)"这个词在2020年刷屏了.在企业积极进行数字化转型,全面提升效率的今天,云原生被认为是云计算的"下一个时代". 12月16 ...

  3. [oeasy]python0010 - python虚拟机解释执行py文件的原理

    ​ 解释运行程序 回忆上次内容 我们这次设置了断点 设置断点的目的是更快地调试 调试的目的是去除​​bug​​ 别害怕​​bug​​ 一步步地总能找到​​bug​​ 这就是程序员基本功 调试​​deb ...

  4. JAVA Spring Boot快速开始

    实践环境 Spring Boot 3.2.1 Maven 3.8.8 JDK 1.8.0_331 创建项目 通过http://start.spring.io/网站创建包含Spring Boot的项目, ...

  5. Odoo 增加web后端的响应能力

    实践环境 Odoo 14.0-20221212 (Community Edition) web_responsive-14.0.1.2.1.zip https://apps.odoo.com/apps ...

  6. 硬件开发笔记(二十八):TPS54331电源设计(一):5V电源供电原理图设计

    前言   电源供电电路设计很重要,为了更好的给对硬件设计有需求的人,特意将电源设计的基础过程描述出来.  本篇描述设计常用的12V转5V电路3A.   TPS54331(DC-DC稳压器) 概述    ...

  7. 【Uni-App】底部栏踩坑

    一.Page.json一定要注册这个页面 Uni-App通过page.json找到,解析不到这个页面文件是没用的 二.配置tabBar属性 "tabBar":{ "col ...

  8. 【Git】上传代码到码云

    教程来自于这个上面: https://www.jianshu.com/p/3e0b213ab03d 第一步:创建码云仓库 具体怎么点选这里不再演示了 第二步:创建本地文件夹 [这个目录用来做本地仓库, ...

  9. 【Maven】下载安装(Linux)

    Maven官网下载地址: http://maven.apache.org/download.cgi 点选这个压缩包 wget或者上传都行 解压 tar -zxvf apache-maven-3.6.3 ...

  10. 【转载】sun的rpc ——rpcbind(nfs文件系统中的rpc)

    原文地址: https://blog.csdn.net/wangpeng138375/article/details/8169071 ================================= ...