Python中的异常类型及处理方式示例详解

作者:Data-Mining 时间:2022-10-27 14:55:58 

前言

Python 是一种面向对象的、解释型的、通用的、开源的脚本编程语言。现在市面上 Python 非常的流行,主要是因为它简单易用,学习成本低,比如要实现某个功能,Python 可能只需要几行代码,而用C语言可能需要上百行代码,因为C语言什么都要得从头开始编码,而 Python 已经内置了很多功能模块,所以,我们只需要导入特定的包,就可以实现想要的效果。

今天,我们主要来了解一下 Python 中的异常类型以及它们的处理方式。说到异常处理,我们首先要知道什么是异常。其实,异常就是一类事件,当它们发生时,会影响到程序的正常执行。

一、什么是异常

其实,异常就是一类事件,当此类事件在程序执行过程中发生时,就会影响程序的正常执行。一般情况下,在 Python 无法正常处理程序时就会发生一个异常,而异常是 Python 的一种对象类型,用来表示一个错误。当 Python 脚本发生异常时我们需要捕获并处理它,否则程序就会终止。

二、异常的类型

Python 中定义了一些标准的异常类型,具体的异常名称和对应的实际意义,我们可以通过下面的表格来了解。

异常名称描述
BaseException所有异常的基类
SystemExit解释器请求退出
KeyboardInterrupt用户中断执行(通常是输入^C)
Exception常规错误的基类
StopIteration迭代器没有更多的值
GeneratorExit生成器(generator)发生异常来通知退出
StandardError所有的内建标准异常的基类
ArithmeticError所有数值计算错误的基类
FloatingPointError浮点计算错误
OverflowError数值运算超出最大限制
ZeroDivisionError除(或取模)零 (所有数据类型)
AssertionError断言语句失败
AttributeError对象没有这个属性
EOFError没有内建输入,到达EOF 标记
EnvironmentError操作系统错误的基类
IOError输入/输出操作失败
OSError操作系统错误
WindowsError系统调用失败
ImportError导入模块/对象失败
LookupError无效数据查询的基类
IndexError序列中没有此索引(index)
KeyError映射中没有这个键
MemoryError内存溢出错误(对于Python 解释器不是致命的)
NameError未声明/初始化对象 (没有属性)
UnboundLocalError访问未初始化的本地变量
ReferenceError弱引用(Weak reference)试图访问已经垃圾回收了的对象
RuntimeError一般的运行时错误
NotImplementedError尚未实现的方法
SyntaxErrorPython 语法错误
IndentationError缩进错误
TabErrorTab 和空格混用
SystemError一般的解释器系统错误
TypeError对类型无效的操作
ValueError传入无效的参数
UnicodeErrorUnicode 相关的错误
UnicodeDecodeErrorUnicode 解码时的错误
UnicodeEncodeErrorUnicode 编码时错误
UnicodeTranslateErrorUnicode 转换时错误
Warning警告的基类
DeprecationWarning关于被弃用的特征的警告
FutureWarning关于构造将来语义会有改变的警告
OverflowWarning旧的关于自动提升为长整型(long)的警告
PendingDeprecationWarning关于特性将会被废弃的警告
RuntimeWarning可疑的运行时行为(runtime behavior)的警告
SyntaxWarning可疑的语法的警告
UserWarning用户代码生成的警告

其实,在上述表格中列出的异常中,也具备一定的层次关系,我们可以通过下图来了解一下。

Python中的异常类型及处理方式示例详解

三、异常处理

在实际开发过程中,我们需要写出健壮性的程序,不希望我们的程序在执行过程中遇到了异常就自动终止。因此,我们需要处理程序执行过程中的异常事件,从而保证程序不会因为发生异常而终止。在编码过程中,我们可以简单使用 try/except 语句来捕捉异常,具体语法如下:


try:
<语句>        # 运行别的代码
except 异常类型:
<语句>        # 如果在try部份引发了异常
else:
<语句>        # 如果没有异常发生

熟悉 Java 的小伙伴都知道,在 Java 中是通过 try...catch 语句来捕获代码中的异常事件的,在 Python 中使用什么呢?

其实,在 Python 中是使用 try...except 语句用来捕获异常,通过监视 try 语句块中的错误,从而让 except 语句捕获异常信息并进行处理。

因此,如果你不想在异常发生时结束你的程序,就需要在 try 语句块中捕获相应的异常。

接下来,我们通过一个代码实例来具体了解一下 try...except 的用法。

代码实例:


#!/usr/bin/python
# -*- coding: UTF-8 -*-

try:
   fh = open("test.txt", "r")
   fh.write("这是一个测试文件,用于测试Python中的异常!")
except IOError:
   print "Error: 写入文件失败"
else:
   print "内容写入文件成功"
   fh.close()

上述代码的意思是以可读模式打开一个 test.txt 文件,然后向文件中写入一段话:这是一个测试文件,用于测试Python中的异常! 因为文件是以可读模式打开的,所以没有写入权限,肯定会出错,但是因为是在 try 代码块中,肯定会被对应的IO错误类型捕获,并输入提示信息:Error:写入文件失败。

运行结果:

Python中的异常类型及处理方式示例详解

然后,我们修改代码,以写模式打开文件再写入对应的语句,修改后代码如下:


#!/usr/bin/python
# -*- coding: UTF-8 -*-

try:
   fh = open("test.txt", "w")
   fh.write("这是一个测试文件,用于测试Python中的异常!")
except IOError:
   print "Error: 写入文件失败"
else:
   print "内容写入文件成功"
   fh.close()

这时,我们发现文件能够正常写入内容了,并且不会触发异常事件发生。

运行结果:

Python中的异常类型及处理方式示例详解

四、try 介绍

try 的工作原理是,当开始一个 try 语句后,python 就在当前程序的上下文中作标记,这样当异常出现时就可以回到这里,try 子句先执行,接下来会发生什么依赖于执行时是否出现异常。大致的情况可以分为两种,一种是触发了异常,另一种是没有触发异常,具体表现如下:

1. 如果当 try 后的代码里发生了异常,python 就跳回到 try 并执行第一个匹配该异常的 except 子句,异常处理完毕,控制流就通过整个 try 语句。

2. 如果在 try 后的代码里没有发生异常,python将执行else语句后的语句,然后控制流通过整个try语句。

其实,上面的代码实例很好的覆盖了这两种情况。

五、finally 介绍

finally 语句块中的内容,无论程序是否发生了异常都执行。这一点和 Java 是类似的,具体我们来看一段代码:


#!/usr/bin/python
# -*- coding: UTF-8 -*-

try:
   fh = open("test.txt", "r")
   fh.write("这是一个测试文件,用于测试Python中的异常!")
except IOError:
   print "Error: 写入文件失败"
else:
   print "内容写入文件成功"
   fh.close()
finally:
   print "异常发生了,执行finally代码块"

上述代码在原来的基础上增加了 finally 代码块,发生了异常,依然会执行 finally 代码块。同样,即使没有触发异常,也会执行相应的 finally 代码块。感兴趣的小伙伴可以自己动手试一下,这里就不演示了。

运行结果:

Python中的异常类型及处理方式示例详解

六、raise 介绍

在 Java 中,我们可以使用 throw 语句主动抛出异常,那么在 Python 中,是否也有类似的关键字呢?答案是肯定的。接下来,我们就来了解一下 raise 关键字。在编码过程中,我们可以使用 raise 语句主动触发异常。具体的语法可以参考如下格式:


raise [Exception [, args [, traceback]]]

需要注意的是语句中 Exception 是异常的类型(例如,IOError、OSError),参数标准异常中任意一种,参数 args 是自已提供的异常参数。最后一个参数 trackback 是可选的,一般为空。

实例代码:


#!/usr/bin/python
# -*- coding: UTF-8 -*-

try:
   fh = open("test.txt", "w")
   fh.write("这是一个测试文件,用于测试Python中的异常!")
except IOError:
   print "Error: 写入文件失败"
else:
   print "内容写入文件成功"
   try:
print "抛出自定义异常"
   raise Exception("这是一个自定义异常事件")
   except:
print "自定义异常事件被捕获"
   fh.close()

finally:
   print "自定义异常发生了,执行finally代码块"

运行结果:

Python中的异常类型及处理方式示例详解

结尾

来源:https://blog.csdn.net/liuzehn/article/details/119857521

标签:Python,异常类型,处理
0
投稿

猜你喜欢

  • 使用Title提升可访问性

    2009-04-04 17:06:00
  • Python解析命令行读取参数--argparse模块使用方法

    2023-06-28 22:48:45
  • go 判断两个 slice/struct/map 是否相等的实例

    2023-07-24 03:42:19
  • Go语言中使用反射的方法

    2023-07-22 22:31:48
  • 简单的Python解密rsa案例

    2022-05-28 07:30:18
  • python使用json.dumps输出中文问题

    2023-11-17 22:04:46
  • python读取TXT每行,并存到LIST中的方法

    2023-08-09 06:09:20
  • axios发送post请求,提交图片类型表单数据方法

    2024-04-26 17:40:27
  • SQL数据查询之DQL语言介绍

    2024-01-26 11:04:25
  • 如何使用XML实现多渠道接入网站的构架

    2008-09-05 17:13:00
  • 如何用定值 Cookie 实现反爬详解

    2023-11-15 23:32:18
  • Oracle数据库索引的维护

    2010-07-26 13:29:00
  • 使用pandas忽略行列索引,纵向拼接多个dataframe

    2022-05-23 08:52:42
  • Tensorflow2.10实现图像分割任务示例详解

    2021-08-31 13:14:47
  • Python中json库的操作指南

    2021-10-11 11:04:43
  • OpenCV图像缩放resize各种插值方式的比较实现

    2023-03-18 13:31:45
  • opencv绘制矩形和圆的实现

    2021-09-24 15:27:22
  • 通过实例解析Python调用json模块

    2022-09-22 02:05:06
  • DW MX 2004新功能:加密FTP

    2009-09-13 18:42:00
  • MySQL ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO) 的原因分解决办法

    2024-01-22 10:02:03
  • asp之家 网络编程 m.aspxhome.com