11-python异常处理

原创
10/18 09:26
阅读数 16

当你的程序出现例外情况时就会发生异常(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 为这个错误所做的事情。


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


异常

>>> s = input('请输入内容: ') 请输入内容: 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('请输入内容:') except EOFError:     print('你按了ctrl+d让文件结尾了?') except KeyboardInterrupt:     print('你结束了程序。') else:    print('你输入的是: {}'.format(text))

输出:

# Press ctrl + d python exceptions_handle.py 请输入内容:按了ctrl+d让文件结尾了? 
# Press ctrl + c $ python exceptions_handle.py 请输入内容:^C 你结束了程序。
python exceptions_handle.py Enter 请输入内容: 没有异常你输入的是:没有异常

它是如何工作的


我们将所有可能引发异常或错误的语句放在 try 代码块中,并将相应的错误或异常的处理器 Handler)放在 except 子句或代码块中。


except 子句可以处理某种特定的错误或异常, 或者是一个在括号中列出的错误或异常。如果没有提供错误或异常的名称,它将处理所有错 误与异常。


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


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


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


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


抛出异常


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


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


案例(保存为 exceptions_raise.py ):

# encoding=UTF-8 class ShortInputException(Exception):     '''一个由用户定义的异常类'''     def __init__(self, length, atleast):         Exception.__init__(self)         self.length = length         self.atleast = atleast 
try:    text = input('请输入内容:' if len(text) < 3: raise ShortInputException(len(text), 3) # 其他工作能在此处继续正常运行 except EOFError:     print('你按ctrl+ 结束了')except ShortInputException as ex:     print((长度错误:  您输入的内容长度是 ' + '{0} , 最短需要 {1}') .format(ex.length, ex.atleast)) else:    print('没有异常.')

输出:

$ python exceptions_raise.py 请输入内容:a ShortInputException:  您输入的内容长度是 1 , 最短需要3 
python exceptions_raise.py 请输入内容:abc 没有异常

它是如何工作的


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


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


Try ... Finally

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


保存该程序为 exceptions_finally.py

import sysimport timef = Nonetry:    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("没有找到 poem.txt")except KeyboardInterrupt:    print("您结束了文件读取")finally:    if f:        f.close()        print("(文件关闭)")

输出:

python exceptions_finally.py 程序非常有趣Press ctrl+c now ^C!! 您结束了文件读取 (文件关闭)

它是如何工作的

我们按照通常文件读取进行操作,但是我们同时通过使用 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 语句所使用的协议它会获取由 open 语句 返回的对象,在本案例中就是“thefile”


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


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



总结


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


《python小白入门系列教程》

01-python安装与特色介绍
02-python你应该知道这些
03-python—9个基础常识 04-python-15种字符串操作
05-列表-元祖-字典-集合操作
06 python循环与分支
07-Python函数详解 08-python中的包与模块关于
09-文件处理与输入输出 10-python面向对象


IT入门 感谢关注


程序员题库→
程序员用的单词表→
练习地址 :www.520mg.com/it



本文分享自微信公众号 - IT入门(learncode)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部