一文搞懂Python的异常

本文详细介绍了Python中的异常,包括异常的概念、产生原因、家族类型、处理方法及其在不同场景下的应用,旨在帮助开发者更好地理解和应对编程中的异常情况,提高代码的稳定性和健壮性。
摘要由CSDN通过智能技术生成

人生之事,不如意者十之有九。

在编程中亦是如此。异常(Exception),遍布于程序各个角落,开发工作的大部分coding,都是为了应对和解决它。

概念

异常,简而言之,是程序在执行期间发生的非预期的、非正常的事件或情况。

举个实际生活的例子:

你周末出门买大龙虾,但当你决定要买哪一只时,你发现没带钱包,那么买大龙虾就是程序要执行的逻辑,而没带钱包就是异常情况。

但异常是一种有一定解决应对方法的错误,就像没带钱包也有可能买得了大龙虾,比如你可以向老板赊账或者暂时借熟人的钱来买。

所以,异常并不一定会完全阻止要完成的事情,有时可能是在提示存在的问题和引导出新的解决方法,应该辩证地去面对它。

产生原因

编程中这些异常的产生可能源自于各种各样的源头,可能是用户提供了错误的输入数据(外因),也可能是系统本身存在逻辑错误(内因)。当这样的异常出现时,如果不加以妥善处理,程序的执行流程将会被强行打断,进而可能引发程序崩溃、数据丢失等严重后果。

家族类型

常见异常类族谱

Python内置了丰富多样的异常类型,每种类型都对应着特定的错误场景。以下是一些常见的异常类型:

  • SyntaxError(语法错误):当代码存在不符合 Python 语法规则的地方时就会引发。例如,遗漏了必要的括号、引号等。
  • NameError(名称错误):当尝试使用一个未定义的变量或函数时产生。
  • TypeError(类型错误):操作中数据类型不匹配导致,比如对一个字符串使用数学运算,1 + "1"
  • ValueError(值错误):提供的值不符合要求,如将一个非数字字符串转换为整数, int("a")
  • IndexError(索引错误):在访问列表等数据结构时,使用了超出范围的索引,比如[][10]
  • KeyError(键错误):在字典中查找不存在的键,比如{}["name"]这样访问就会引发。
  • AttributeError(属性错误):尝试访问对象上不存在的属性就会引发,比如A类没有name属性,而A.name就会引发此异常。
  • ZeroDivisionError(零除错误):尝试除以零就会引发,如1/0
  • IOError(IO错误):输入输出相关的文件流错误, 比如文件流打开异常、网络流访问异常等。
  • FileNotFoundError(文件不存在错误):指定的文件不存在就会引发,比如尝试读写不存在的文件,是IOError的一个细分子类。
  • ImportError(导入模块错误):Python会按照一定的路径搜索模块文件。如果import的模块文件没有在搜索路径中找到,就会引发ImportError错误,比如from math import zero
  • RuntimeError(运行时错误)RuntimeError是一种运行时异常,表示在程序运行过程中发生了一些无法预期的情况而导致的一般性错误。比如资源不足等
  • NotImplementedError(未实现方法异常):当一个方法或操作尚未实现就会引发,比如图形父类要求计算面积方法必须实现(父类方法写着raise NotImplementedError("子类必须实现这个方法")),那么继承了图形父类的三角形子类如果不实现计算面积方法就会引发。
  • IndentationError(缩进错误):代码格式缩进不正确的地方会引发,是SyntaxError的细分子类。
  • KeyboardInterrupt(键盘中断):当键盘按下Ctrl+C时会引发捕获

需要注意的是,BaseException所有异常的基类(注意,不是Exception)。它包括了系统退出相关的异常(如 SystemExit)以及异常中断相关的异常(如 KeyboardInterrupt)等。它位于异常层次结构的最顶端。

Exception继承自BaseException,是大多数用户自定义异常和Python内置异常的直接或间接基类,其他常见的异常如 IOErrorValueErrorTypeError 等都属于 Exception 及其子类。

处理方法

内置异常处理

为了有效地应对这些异常情况,Python 提供了一套强大且灵活的异常处理机制,而其中的核心就是 try-except 语句结构,以及另外两种特殊情况:try-except-elsetry-except-finally
以下是一个面对ZeroDivisionError(零除错误) 异常的处理示例:

# try-except 示例
try:
    a = 10 / 0  # 会引发异常
except ZeroDivisionError:  # 尝试除以零就会引发——零除错误
    print(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值