首页 > 编程语言 >17 Python异常处理(捕获异常、抛出异常、自定义异常)

17 Python异常处理(捕获异常、抛出异常、自定义异常)

时间:2024-09-09 10:04:03浏览次数:8  
标签:MyError 自定义 17 except try print 异常

本篇是 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异常:报错啦啦啦啦

标签:MyError,自定义,17,except,try,print,异常
From: https://www.cnblogs.com/GilbertDu/p/18404006

相关文章

  • 南沙信奥赛C++陈老师解一本通题: 1171:大整数的因子
    ​ 【题目描述】已知正整数k满足2≤k≤9,现给出长度最大为30位的十进制非负整数c,求所有能整除c的k。【输入】一个非负整数c,c的位数≤30。【输出】若存在满足 c%k==0的k,从小到大输出所有这样的k,相邻两个数之间用单个空格隔开;若没有这样的k,则输出"none"。【输入样......
  • [C++#33][异常] 错误码 | 抛出与捕获 | 异常安全 | 异常体系
    目录C语言与C++错误处理方式的对比及应用一、C语言传统的错误处理方式1.终止程序:assert2.返回错误码缺点:二、C++中的异常处理机制1.基本概念2.异常的抛出与捕获3.异常的重新抛出三、C++中的异常安全1.构造函数与析构函数的异常2.RAII(资源获取即初始化)3.使......
  • 20240909_041725 c语言 代码注释 两种
    两种注释注释示例......
  • day17打卡
    修剪二叉搜索树/**Definitionforabinarytreenode.structTreeNode{intval;TreeNode*left;TreeNode*right;TreeNode():val(0),left(nullptr),right(nullptr){}TreeNode(intx):val(x),left(nullptr),right(nullptr){}TreeNode(......
  • C++17: 用折叠表达式实现一个IsAllTrue函数
    前言让我们实现一个IsAllTrue函数,支持变长参数,可传入多个表达式,必须全部计算为true,该函数才返回true。本文记录了逐步实现与优化该函数的思维链,用到了以下现代C++新特性知识,适合对C++进阶知识有一定了解的人。这样一种从实际问题来学习和运用知识的过程还是挺有趣的,特此整理分......
  • 20240909_031725 c语言 执行输出语句的流程
    源代码-》编译后代码-》可执行代码下图为可执行代码的示例路径:......
  • 【Java】已解决:com.alibaba.com.caucho.hessian.io.HessianProtocolException异常
    文章目录一、分析问题背景二、可能出错的原因三、错误代码示例四、正确代码示例服务端代码客户端代码五、注意事项已解决:com.alibaba.com.caucho.hessian.io.HessianProtocolException异常一、分析问题背景在使用Hessian进行远程调用时,开发者有时会遇到com.al......
  • 鹏哥C语言自定义笔记重点(44-)
    44.不能给地址复制,strcpy拷贝过去连带着\045.46. 47. 48.strstr   //查找子串的一个函数49.strtok  //切割字符串 50.strerror   //返回错误码,所对应的错误信息 检查的是文件51.如果不正确则返回0  52.memcpy负责拷贝两块独立空间......
  • 20240909_011725 c语言 预处理
    在C语言中,第一行#include<stdio.h>是一个预处理指令,用于包含(或说,导入)标准输入输出库(StandardInputOutputLibrary)的头文件。这个库提供了进行输入输出操作的函数,比如printf()用于在屏幕上显示输出,scanf()用于从键盘读取输入等。具体来说:#include是一个预处理指令,告诉编译器......
  • 20240909_021725 c语言 骨架结构
    关注骨架结构明确intmainreturn0的意义与功能......