Python标准异常和异常处理详解

  • Post category:Python

Python标准异常和异常处理详解

什么是异常?

在 Python 中,异常(Exception)是一种错误状态或者异常情况,当程序运行期间出现错误或异常时会引发异常。一个引发异常的代码称为抛出异常(raise an exception),接收并处理异常的代码十分重要,不做好异常处理可能会导致程序出现意外的错误或中断。

Python标准异常

Python 提供了一系列默认的异常类型,我们也称之为标准异常。这些异常包含了大部分我们在编写代码过程中可能会遇到的常见错误,比如语法错误、数组索引超出范围等等。下面列举了常见的一些标准异常:

  • BaseException:所有异常的基类。
  • Exception:常规异常的基类。
  • TypeError:类型错误,试图访问或操作错误的类型的对象。
  • ValueError:数值型数据类型错误,试图操作一个非法数值数据类型的对象。
  • NameError:名称错误,试图访问未定义的变量或函数。
  • AttributeError:访问未知属性,试图访问未定义的对象属性。
  • ImportError:导入模块失败,无法找到指定的模块。
  • KeyError:关键字错误,试图访问字典中不存在的键。
  • IndexError:索引错误,列表、元组、字符串等类型中无法找到指定的下标。
  • SyntaxError:语法错误,程序代码无法被解释器正确理解。
  • ZeroDivisionError:除以0错误。

异常处理

要有效地处理异常,需要使用try-except语句块。try语句块包含了可能出现异常的代码,并且紧跟着一个或多个except块,这些块按照指定的顺序逐一进行匹配,最终执行匹配到的第一个except块。如果没有任何一个except块匹配成功,那么异常会继续传播,直到被解释器捕获或程序退出。

下面是一个示例,它尝试打开一个不存在的文件,并处理了FileNotFoundError异常:

try:
    f = open('nonexist.txt')
except FileNotFoundError as e:
    print('File not found:', e)

如果文件不存在,那么程序将会输出File not found: [Errno 2] No such file or directory: 'nonexist.txt'

除了指定特定类型的异常,也可以在except块后添加一个as语句为异常对象指定名称,方便后续引用。同样,也可以添加一个else块使得在没有异常发生时执行一些操作,或者一个finally块,在处理完异常后最终执行一些代码(无论是否发生异常都会被执行)。

下面展示了更复杂的try-except语句块形式:

try:
    # code that may raise an exception
except ExceptionType1 as e1:
    # handle exception type 1
except ExceptionType2 as e2:
    # handle exception type 2
except:
    # handle all other types of exceptions
else:
    # handle case when no exception was raised
finally:
    # handle any cleanup tasks

示例

下面是一个带有异常处理的示例。这个程序尝试从用户输入的字符串中提取数字,如果失败则弹出一个提示框告知用户:

import tkinter as tk
from tkinter import messagebox

try:
    text = input('Enter a number: ')
    num = int(text)
except ValueError as e:
    messagebox.showwarning('Invalid Input', f'Failed to convert "{text}" to integer.')
else:
    messagebox.showinfo('Success', f'The number is {num}.')

这个程序定义了一个 GUI 窗口和一个文本输入框。当用户输入数字并点击按钮时,程序尝试从输入框中提取数字。如果成功,它弹出一个包含数字的对话框,否则弹出一个包含错误信息的警告框。这个程序对用户输入进行了一定程度的安全检查,避免了程序崩溃或者意外退出的情况。

下面是另一个示例。这个程序尝试打开一个文件,如果成功则输出文件内容;如果失败则弹出一个对话框告知用户。注意,这个程序使用了with语句块自动关闭文件句柄,无需手动调用f.close()

import tkinter as tk
from tkinter import filedialog, messagebox

try:
    root = tk.Tk()
    root.withdraw()
    filename = filedialog.askopenfilename()
    with open(filename) as f:
        contents = f.read()
        print(contents)
except FileNotFoundError:
    messagebox.showwarning('File Error', 'Failed to open the file.')

这个程序打开了一个文件对话框,让用户选择一个文件直到文件打开或用户取消操作。如果文件成功打开,则程序读取文件内容并输出;否则,程序弹出一个警告框提示“打开文件失败”。