Python异常处理机制详解:try-except-finally与自定义异常

Oliver
Oliver
发布时间:2026-10-13 | 5人浏览过
原创

本文深入解析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异常处理内容对大家的学习有所帮助。

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表