17 Python异常处理(捕获异常、抛出异常、自定义异常)
本篇是 Python 系列教程第 17 篇,更多内容敬请访问我的 Python 合集
当我们编写代码时,可能会遇到各种各样的错误情况,比如除数为零、找不到文件、网络问题等等。为了优雅地处理这些问题,Python 提供了异常处理机制。
1 异常处理的基本结构
Python 中的异常处理主要依赖于 try 和 except 语句。基本的结构如下:
try:
# 尝试执行的代码块
some_code()
except SomeException as e:
# 如果在 try 块中引发了指定类型的异常,则执行此代码块
print(f"An error occurred: {e}")
2 异常处理的组成部分
try 块:这部分包含了你希望监控的可能引发异常的代码。
except 块:如果在 try 块中引发了异常,那么会跳转到 except 块中执行。
- 可以指定特定类型的异常来捕获,也可以不指定类型来捕获所有异常。
- 如果指定了异常类型,还可以获取异常对象来处理。
else 块(可选):如果没有异常发生,则执行 else 块中的代码。
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异常处理(捕获异常、抛出异常、自定义异常)的更多相关文章
- Python学习(17)异常处理
目录 Python 异常处理 Python 标准异常 异常处理 使用except而不带任何异常类型 使用except而带多种异常类型 try-finally 语句 异常参数 异常的参数 用户自定义参数 ...
- python异常处理try,except,else,finally,raise
先看下else的使用: try: ... exception: ... else: ... 只有在try中没有发生任何异常,所有代码完全成功的情况下才会转入else 再看下finally: final ...
- python异常处理的哲学
所谓异常指的是程序的执行出现了非预期行为,就好比现实中的做一件事过程中总会出现一些意外的事.异常的处理是跨越编程语言的,和具体的编程细节相比,程序执行异常的处理更像是哲学.限于认知能力和经验所限,不可 ...
- Python 异常处理
Python 异常处理 python提供了两个非常重要的功能来处理python程序在运行中出现的异常和错误.你可以使用该功能来调试python程序. 异常处理: 本站Python教程会具体介绍. 断言 ...
- Python异常处理总结
一.何谓异常处理 在我们调试程序时,经常不可避免地出现意料之外的情况,导致程序不得不停止运行,然后提示大堆提示信息,大多是这种情况都是由异常引起的.异常的出现一方面是因为写代码时粗心导致的语法错误,这 ...
- python 异常处理函数--raise
Python 异常处理--raise函数用法 在Python中,要想引发异常,最简单的形式就是输入关键字raise,后跟要引发的异常的名称.异常名称标识出具体的类: Python异常处理是那些类的对象 ...
- Python异常处理回顾与总结
1 引言 在我们调试程序时,经常不可避免地出现意料之外的情况,导致程序不得不停止运行,然后提示大堆提示信息,大多是这种情况都是由异常引起的.异常的出现一方面是因为写代码时粗心导致的语法错误,这种错误在 ...
- Python异常处理与上下文管理器
Python异常处理 异常与错误 错误 可以通过IDE或者解释器给出提示的错误opentxt('a.jpg','r') 语法层面没有问题,但是自己代码的逻辑有问题if age>18: print ...
- python 异常处理(25)
在python开发中,代码书写时难免有疏忽或者意向不到的bug,导致程序run的过程中有可能会直接崩溃:然后对于程序猿而言,程序因bug崩溃是家常便饭,为了增加程序的健壮性,防止程序崩溃,我们可以对程 ...
- Python 异常处理与反射机制
Python 的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为ABC语言的一种继承.Py ...
随机推荐
- mac 安装homebrew 报443
描述 macOS安装Homebrew时总是报错(Failed to connect to raw.githubusercontent.com port 443: Connection refused) ...
- 重磅集结!CNCF/VMware/PingCAP/网易数帆/阿里云联合出品云原生生态大会
"云原生(Cloud Native)"这个词在2020年刷屏了.在企业积极进行数字化转型,全面提升效率的今天,云原生被认为是云计算的"下一个时代". 12月16 ...
- [oeasy]python0010 - python虚拟机解释执行py文件的原理
解释运行程序 回忆上次内容 我们这次设置了断点 设置断点的目的是更快地调试 调试的目的是去除bug 别害怕bug 一步步地总能找到bug 这就是程序员基本功 调试deb ...
- JAVA Spring Boot快速开始
实践环境 Spring Boot 3.2.1 Maven 3.8.8 JDK 1.8.0_331 创建项目 通过http://start.spring.io/网站创建包含Spring Boot的项目, ...
- Odoo 增加web后端的响应能力
实践环境 Odoo 14.0-20221212 (Community Edition) web_responsive-14.0.1.2.1.zip https://apps.odoo.com/apps ...
- 硬件开发笔记(二十八):TPS54331电源设计(一):5V电源供电原理图设计
前言 电源供电电路设计很重要,为了更好的给对硬件设计有需求的人,特意将电源设计的基础过程描述出来. 本篇描述设计常用的12V转5V电路3A. TPS54331(DC-DC稳压器) 概述 ...
- 【Uni-App】底部栏踩坑
一.Page.json一定要注册这个页面 Uni-App通过page.json找到,解析不到这个页面文件是没用的 二.配置tabBar属性 "tabBar":{ "col ...
- 【Git】上传代码到码云
教程来自于这个上面: https://www.jianshu.com/p/3e0b213ab03d 第一步:创建码云仓库 具体怎么点选这里不再演示了 第二步:创建本地文件夹 [这个目录用来做本地仓库, ...
- 【Maven】下载安装(Linux)
Maven官网下载地址: http://maven.apache.org/download.cgi 点选这个压缩包 wget或者上传都行 解压 tar -zxvf apache-maven-3.6.3 ...
- 【转载】sun的rpc ——rpcbind(nfs文件系统中的rpc)
原文地址: https://blog.csdn.net/wangpeng138375/article/details/8169071 ================================= ...