异常

当你的程序出现例外情况时就会发生异常(Exception)。例如,当你想要读取一个文件时,而那个文件却不存在,怎么办?又或者你在程序执行时不小心把它删除了,怎么办?这些通过使用异常来进行处理。

类似地,如果你的程序中出现了一些无效的语句该怎么办?Python 将会对此进行处理,举起(Raises)它的小手来告诉你哪里出现了一个错误(Error)。

错误

你可以想象一个简单的 print 函数调用。如果我们把 print 误拼成 Print 会怎样?你会注意到它的首字母是大写。在这一例子中,Python 会抛出(Raise)一个语法错误。

>>> Print("Hello World")
Traceback (most recent call last):File "<stdin>", line 1, in <module>
NameError: name 'Print' is not defined >>> print("Hello World")
Hello World

你会注意到一个 NameError 错误被抛出,同时 Python 还会打印出检测到的错误发生的位置。这就是一个错误错误处理器(Error Handler)2 为这个错误所做的事情。

异常

我们将尝试(Try)去读取用户的输入内容。按下 [ctrl-d] 来看看会发生什么事情。

>>> s = input('Enter something --> ')
Enter something --> Traceback (most recent call last):File "<stdin>", line 1, in <module>
EOFError

此处 Python 指出了一个称作 EOFError 的错误,代表着它发现了一个文件结尾(End of File)符号(由 ctrl-d 实现)在不该出现的时候出现了。

处理异常

我们可以通过使用 try..except 来处理异常状况。一般来说我们会把通常的语句放在 try 代码块中,将我们的错误处理器代码放置在 except 代码块中。

案例(保存文 exceptions_handle.py):

try:text = input('Enter something --> ') except EOFError:print('Why did you do an EOF on me?') except KeyboardInterrupt:print('You cancelled the operation.') else:print('You entered {}'.format(text))

输出:

# Press ctrl + d
$ python exceptions_handle.py
Enter something --> Why did you do an EOF on me?# Press ctrl + c
$ python exceptions_handle.py
Enter something --> ^CYou cancelled the operation.$ python exceptions_handle.py
Enter something --> No exceptions
You entered No exceptions

它是如何工作的

我们将所有可能引发异常或错误的语句放在 try 代码块中,并将相应的错误或异常的处理器(Handler)放在 except 子句或代码块中。except 子句可以处理某种特定的错误或异常,或者是一个在括号中列出的错误或异常。如果没有提供错误或异常的名称,它将处理所有错误与异常。

要注意到必须至少有一句 except 字句与每一句 try 字句相关联。不然,有一个 try 代码块又有什么意义?

如果没有任何错误或异常被处理,那么将调用 Python 默认处理器,它只会终端程序执行并打印出错误信息。我们已经在前面的章节里见过了这种处理方式。

你还可以拥有一个 else 子句与 try..except 代码块相关联。else 子句将在没有发生异常的时候执行。

在下一个案例中,我们还将了解如何获取异常对象以便我们可以检索其他信息。

抛出异常3

你可以通过 raise 语句来引发一次异常,具体方法是提供错误名或异常名以及要抛出(Thrown)异常的对象。

你能够引发的错误或异常必须是直接或间接从属于 Exception(异常) 类的python 派生类。

案例(保存为 exceptions_raise.py):

# encoding=UTF-8 class ShortInputException(Exception): '''一个由用户定义的异常类''' def __init__(self, length, atleast): Exception.__init__(self)self.length = lengthself.atleast = atleast try:text = input('Enter something --> ') if len(text) < 3: raise ShortInputException(len(text), 3) # 其他工作能在此处继续正常运行 except EOFError:print('Why did you do an EOF on me?') except ShortInputException as ex:print(('ShortInputException: The input was ' + '{0} long, expected at least {1}').format(ex.length, ex.atleast)) else:print('No exception was raised.')

输出:

$ python exceptions_raise.py
Enter something --> a
ShortInputException: The input was 1 long, expected at least 3$ python exceptions_raise.py
Enter something --> abc
No exception was raised.

它是如何工作的

在本例中,我们创建了我们自己的异常类型。这一新的异常类型叫作 ShortInputException。它包含两个字段——获取给定输入文本长度的 length,程序期望的最小长度 atleast。

在 except 子句中,我们提及了错误类,将该类存储 as(为) 相应的错误名或异常名。这类似于函数调用中的形参与实参。在这个特殊的 except 子句中我们使用异常对象的 length 与 atleast 字段来向用户打印一条合适的信息。

Try ... Finally

假设你正在你的读取中读取一份文件。你应该如何确保文件对象被正确关闭,无论是否会发生异常?这可以通过 finally 块来完成。

保存该程序为 exceptions_finally.py:

import sys import timef = None try:f = open("poem.txt") # 我们常用的文件阅读风格 while True:line = f.readline() if len(line) == 0: break print(line, end='')sys.stdout.flush()print("Press ctrl+c now") # 为了确保它能运行一段时间 time.sleep(2) except IOError:print("Could not find file poem.txt") except KeyboardInterrupt:print("!! You cancelled the reading from the file.") finally: if f:f.close()print("(Cleaning up: Closed the file)")

输出:

$ python exceptions_finally.py
Programming is fun
Press ctrl+c now
^C!! You cancelled the reading from the file.
(Cleaning up: Closed the file)

它是如何工作的

我们按照通常文件读取进行操作,但是我们同时通过使用 time.sleep 函数任意在每打印一行后插入两秒休眠,使得程序运行变得缓慢(在通常情况下 Python 运行得非常快速)。当程序在处在运行过过程中时,按下 ctrl + c 来中断或取消程序。

你会注意到 KeyboardInterrupt 异常被抛出,尔后程序退出。不过,在程序退出之前,finally 子句得到执行,文件对象总会被关闭。

另外要注意到我们在 print 之后使用了 sys.stout.flush(),以便它能被立即打印到屏幕上。

with 语句

在 try 块中获取资源,然后在 finally 块中释放资源是一种常见的模式。因此,还有一个 with 语句使得这一过程可以以一种干净的姿态得以完成。

保存为 exceptions_using_with.py:

with open("poem.txt") as f: for line in f:print(line, end='')

它是如何工作的

程序输出的内容应与上一个案例所呈现的相同。本例的不同之处在于我们使用的是 open 函数与 with 语句——我们将关闭文件的操作交由 with open 来自动完成。

在幕后发生的事情是有一项 with 语句所使用的协议(Protocol)。它会获取由 open 语句返回的对象,在本案例中就是“thefile”。

+

总会在代码块开始之前调用 thefile.__enter__ 函数,并且总会在代码块执行完毕之后调用 thefile.__exit__。

因此,我们在 finally 代码块中编写的代码应该格外留心 __exit__ 方法的自动操作。这能够帮助我们避免重复显式使用 try..finally 语句。

有关Python教程中这话题的更多讨论已经超出了本书所能涉及的范围,因此请参考 PEP 343 来了解更加全面的解释。

总结

我们已经讨论了 try..except 和 try..finally 语句的用法。同时我们也已经看到了如何创建我们自己的python 异常类型,还有如何抛出异常。

接下来,我们将探索 Python 的标准库。

转载于:https://www.cnblogs.com/yuanrenxue/p/10670124.html

Python中的异常(Exception)处理相关推荐

  1. Python中获取异常(try Exception)信息

    Python中获取异常(try Exception)信息 参考文章: (1)Python中获取异常(try Exception)信息 (2)https://www.cnblogs.com/hixiao ...

  2. Python基础之:Python中的异常和错误

    文章目录 简介 Python中的内置异常类 语法错误 异常 异常处理 抛出异常 异常链 自定义异常 finally 简介 和其他的语言一样,Python中也有异常和错误.在 Python 中,所有异常 ...

  3. python读取json数据格式问题_浅谈Python中的异常和JSON读写数据的实现

    异常可以防止出现一些不友好的信息返回给用户,有助于提升程序的可用性,在java中通过try ... catch ... finally来处理异常,在Python中通过try ... except .. ...

  4. python 忽略 异常_如何忽略Python中的异常?

    python 忽略 异常 什么是例外? (What is an Exception?) An exception is an event, which occurs during the execut ...

  5. 【华为云技术分享】Python 中的异常和错误

    [摘要] 异常就是程序运行时发生错误的信号,在python中,错误触发的异常如下 异常和错误 第一:程序中难免出现错误,而错误分成两种 1.语法错误(这种错误,根本过不了python解释器的语法检测, ...

  6. Python中的异常、try、except、finally、raise语法以及示例

    0. 引言 在编写Python程序时,有时我们不确定一段语句是否可以正确执行,因为如果发生错误,那么程序就会终止,这样对完整代码实现很不友好.我们希望可以程序可以根据不同的错误(异常)从而执行不同的语 ...

  7. python中的异常分类_列举 5 个 Python 中的异常类型以及其含义【面试题详解】

    今天爱分享给大家带来列举 5 个 Python 中的异常类型以及其含义[面试题详解],希望能够帮助到大家. BaseException +-- SystemExit +-- KeyboardInter ...

  8. 在Python中捕捉异常

    在Python中捕捉异常 在Python中,可以使用try语句处理异常. 可能引发异常的关键操作放在try子句中,并且将处理异常的代码编写在except子句中. 捕获异常后,我们将执行什么操作取决于我 ...

  9. Java中的异常 Exception

    Java中的异常 Exception java.lang.Exception类是Java中所有异常的直接或间接父类.即Exception类是所有异常的根类. 比如程序: public class Ex ...

  10. python中什么是异常_一文教你读懂 Python 中的异常信息

    在写 Python 代码的时候,当代码中出现错误,会在输出的时候打印 Traceback  错误信息,很多初学者看到那一堆错误信息,往往都会处于懵逼状态,脑中总会冒出一句,这都是些啥玩意.如果你是第一 ...

最新文章

  1. 入机器学习大坑,需要什么样的数学水平?
  2. Go http源码解析(一)
  3. 网络推广外包浅析提升移动端网站建设效率有哪些网络推广外包技巧
  4. LVM是逻辑盘卷管理1
  5. 【0805作业】模拟多人爬山
  6. 洛谷3871 [TJOI2010]中位数 维护队列的中位数
  7. 游戏筑基开发之文件操作(C语言)
  8. PostgreSQL如何导入SJIS字符集的文件
  9. SQL中,把SQL查询分析器查询出来的结果,导出到EXCEL表格
  10. 体育类App原型制作分享-Onefootball
  11. 签订保险合同后的事-续保、批单、退保、理赔
  12. Flutter 开发错误集合二
  13. 苹果手机 生成html文件,苹果手机这个功能太厉害了,1秒就能将纸质文档转换为Word...
  14. 如何搭建一个集群项目
  15. 您的第一个工程项目 [原创iOS开发-Xcode教程]
  16. Python调用百度AI接口
  17. 图片批量重命名的2种好方法
  18. html css精灵,CSS spirit /css精灵
  19. 前端进阶之setTimeout 倒计时为什么会出现误差?
  20. Origin使用技巧(5),Origin科研绘图软件2021中文版下载安装

热门文章

  1. 奔四的技术人,内心都有哪些波澜?
  2. 学习进度条(第六周)
  3. IE下a标签会触发window.onbeforeunload的问题
  4. hdu1032 Train Problem II (卡特兰数)
  5. AppController
  6. 我的第一个Windows Phone 7应用程序
  7. Javascript中的类实现
  8. csharp:Chart
  9. CF(439E - Devu and Birthday Celebration)莫比乌斯容斥
  10. ECharts xAxis.type='time'时间轴时卡顿问题