Python异常处理机制详解:try-except-finally与自定义异常
本文深入解析Python中的异常处理机制,详细讲解try-except-finally语句块的用法。通过具体代码示例,展示如何处理EOFError、KeyboardInterrupt等内置异常,以及如何定义和使用自定义异常类ShortInputException。文章还介绍了raise语句引发异常的方法,帮助开发者掌握Python错误处理的完整流程。
Python异常处理概述
本文通过具体实例详细解析Python中异常处理的使用方法,旨在为读者提供清晰的参考指南。
在Java开发中,我们习惯使用try...catch或try...catch...finally结构来捕获并展示异常。令人欣慰的是,Python也提供了类似的机制来处理异常情况。
try..except
try-except基本用法
该结构用于在异常发生时通过except子句进行处理,从而避免程序自动退出。例如,在Python中获取用户输入时,如果用户按下Ctrl-d(Unix/Linux系统)或Ctrl-z(Windows系统)发送文件结束符,程序会抛出EOFError(文件结束异常)。我们可以利用try-except结构来处理这种情况:
#!/usr/bin/python
# Filename: try_except.py
import sys
try:
s = raw_input('Enter something --> ')
except EOFError:
print '\nWhy did you do an EOF on me?'
sys.exit() # exit the program
except:
print '\nSome error/exception occurred.'
# here, we are not exiting the program
print 'Done'
在运行程序时输入Ctrl-d(或Ctrl-z):
$ python try_except.py Enter something --> Why did you do an EOF on me?
$ python try_except.py Enter something --> Python is exceptional! Done
从输出可见,当触发EOFError异常时,程序执行了except EOFError:分支的内容。如果发生其他类型的异常,则执行except:(无特定异常类型)分支的内容。此外,except后面还可以跟随else子句,当没有发生任何异常时,将执行else子句中的代码。请注意,在开始之前务必导入sys模块。
关于catch的使用说明
try.. catch
catch(在Python中对应except)主要用于在异常发生时捕获异常信息以便显示。由于作者尚未见到实际使用案例,也不确定是否推荐此用法,若有读者找到相关示例,欢迎留言补充。
try-finally确保资源释放
try.. finally
如果在读取文件时,无论是否发生异常都需要关闭文件,该如何操作?这可以通过finally块来实现。需要注意的是,在一个try块下,可以同时使用except子句和finally块,但需要将其中一个嵌入另一个。以下是一个示例(参考之前文件读写中的poem.txt):
#!/usr/bin/python
# Filename: finally.py
import time
try:
f = file('poem.txt')
while True: # our usual file-reading idiom
line = f.readline()
if len(line) == 0:
break
time.sleep(2)
print line,
finally:
f.close()
print 'Cleaning up...closed the file'
输出结果如下:
$ python finally.py Programming is fun When the work is done Cleaning up...closed the file Traceback (most recent call last): File "finally.py", line 12, in ? time.sleep(2) KeyboardInterrupt
我们执行了常规的文件读取操作,但特意在每打印一行之前使用time.sleep方法暂停2秒。这样做的目的是让程序运行速度变慢(因为Python本身执行速度较快)。在程序运行期间,按下Ctrl-c中断/取消程序。
我们可以观察到KeyboardInterrupt异常被触发,导致程序退出。然而,在程序退出之前,finally子句仍然被执行,从而正确关闭了文件。
使用raise引发自定义异常
使用raise引发异常
我们可以使用raise语句来引发异常,但必须指明错误/异常的名称以及伴随异常触发的异常对象。所引发的错误或异常必须是Error或Exception类的直接或间接子类。以下是一个具体示例:
#!/usr/bin/python
# Filename: raising.py
class ShortInputException(Exception):
'''A user-defined exception class.'''
def __init__(self, length, atleast):
Exception.__init__(self)
self.length = length
self.atleast = atleast
try:
s = raw_input('Enter something --> ')
if len(s) < 3:
raise ShortInputException(len(s), 3)
# Other work can continue as usual here
except EOFError:
print '\nWhy did you do an EOF on me?'
except ShortInputException, x:
print 'ShortInputException: The input was of length %d, \
was expecting at least %d' % (x.length, x.atleast)
else:
print 'No exception was raised.'
输出结果如下:
$ python raising.py Enter something --> Why did you do an EOF on me?
$ python raising.py Enter something --> ab ShortInputException: The input was of length 2, was expecting at least 3
$ python raising.py Enter something --> abc No exception was raised.
在此示例中,我们创建了自己的异常类型,当然也可以使用任何预定义的异常或错误。这里自定义的异常类型是ShortInputException类。它包含两个属性:length表示给定输入的长度,atleast表示程序期望的最小长度。
在except子句中,我们提供了错误类和用于表示错误/异常对象的变量。这与函数调用中的形参和实参概念类似。当触发raise语句时,会调用对应的except子句执行。在本例中,这引发了except ShortInputException, x这一错误处理逻辑,其作用类似于函数调用。
对Python感兴趣的其他读者,可查看本站专题:《Python入门与进阶经典教程》、《Python字符串操作技巧汇总》、《Python列表(list)操作技巧总结》、《Python编码操作技巧总结》、《Python数据结构与算法教程》、《Python函数使用技巧总结》及《Python文件与目录操作技巧汇总》。
希望本文所述的Python异常处理内容对大家的学习有所帮助。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













