菜单
本页目录

1. 知识点目标

本知识点旨在让学员深入了解 Python 中异常处理的基本概念、语法、常见异常类型,详细掌握 try - except 语句及其参数的使用,以及 finally 和 else 子句在异常处理中的作用,同时学会自定义异常类。

2. 异常处理的基本概念

在 Python 中,异常是程序执行过程中出现的错误。当异常发生时,Python 会创建一个异常对象并抛出,该对象包含了异常的类型和相关信息。如果不处理这些异常,程序将会终止。异常处理机制用于捕获和处理这些异常,使程序能够继续执行或进行适当的清理工作。

3. 常见异常类型及参数说明

SyntaxError
含义:语法错误,通常是由于代码书写不符合 Python 语法规则导致的。
参数:该异常一般没有用户自定义的参数。当发生 SyntaxError 时,Python 解释器会给出错误的位置和简单的错误描述,例如:

# 错误示例,少了冒号
if True
    print("Hello")

运行上述代码,会抛出 SyntaxError,错误信息会提示在 if True 这一行缺少冒号。
NameError
含义:使用未定义的变量或函数。
参数:该异常会携带未定义的名称作为参数。例如:

try:
    print(undefined_variable)
except NameError as e:
    print(f"捕获到 NameError: {e}")

在上述代码中,e 是 NameError 异常对象,其包含的信息会显示未定义的变量名 undefined_variable。
TypeError
含义:操作或函数应用于不兼容的类型。
参数:异常对象会携带关于类型不兼容的详细信息。例如:

try:
    result = "abc" + 1
except TypeError as e:
    print(f"捕获到 TypeError: {e}")

这里 e 会说明不能将字符串和整数相加。
ZeroDivisionError
含义:试图除以零。
参数:异常对象会提示除以零的错误信息。例如:

try:
    result = 1 / 0
except ZeroDivisionError as e:
    print(f"捕获到 ZeroDivisionError: {e}")

e 会显示 “division by zero” 的错误信息。
IndexError
含义:访问列表、元组等序列类型时,使用的索引超出了范围。
参数:异常对象会指出使用的无效索引。例如:

my_list = [1, 2, 3]
try:
    print(my_list[10])
except IndexError as e:
    print(f"捕获到 IndexError: {e}")

e 会显示索引超出范围的信息,如 “list index out of range”。
KeyError
含义:访问字典中不存在的键。
参数:异常对象会携带不存在的键。例如:

my_dict = {'a': 1, 'b': 2}
try:
    print(my_dict['c'])
except KeyError as e:
    print(f"捕获到 KeyError: {e}")

e 会显示不存在的键 'c'。

4. try - except 语句及参数说明

try - except 语句的基本语法如下:

try:
    # 可能会抛出异常的代码块
    pass
except ExceptionType as variable:
    # 当指定类型的异常发生时执行的代码块
    pass

ExceptionType:指定要捕获的异常类型。可以是 Python 内置的异常类型,如 ZeroDivisionError、IndexError 等,也可以是自定义的异常类型。
as variable:可选参数,用于将捕获到的异常对象赋值给一个变量,方便在 except 块中使用该异常对象的信息。例如:

try:
    result = 10 / 0
except ZeroDivisionError as e:
    print(f"捕获到 ZeroDivisionError: {e}")

这里 e 就是 ZeroDivisionError 异常对象,可以通过它获取异常的详细信息。

5. 捕获多个异常

可以使用多个 except 子句来捕获不同类型的异常。示例如下:

try:
    num1 = 10
    num2 = 0
    result = num1 / num2
    my_list = [1, 2, 3]
    print(my_list[10])
except ZeroDivisionError as e:
    print(f"捕获到 ZeroDivisionError: {e}")
except IndexError as e:
    print(f"捕获到 IndexError: {e}")

每个 except 子句可以指定不同的异常类型,并将捕获到的异常对象赋值给相应的变量。

6. 捕获所有异常

可以使用 except 语句不带任何异常类型来捕获所有异常。示例如下:

try:
    num1 = 10
    num2 = 0
    result = num1 / num2
except Exception as e:
    print(f"捕获到异常: {e}")

这里使用 Exception 作为通用的异常类型,e 会包含具体异常的信息。

7. else 子句

else 子句可以在 try 块没有抛出任何异常时执行。示例如下:

try:
    num1 = 10
    num2 = 2
    result = num1 / num2
except ZeroDivisionError as e:
    print(f"捕获到 ZeroDivisionError: {e}")
else:
    print(f"结果是:{result}")

else 子句没有特定的参数,它只是在 try 块执行成功后执行。

8. finally 子句

finally 子句无论 try 块是否抛出异常,都会被执行。示例如下:

try:
    num1 = 10
    num2 = 0
    result = num1 / num2
except ZeroDivisionError as e:
    print(f"捕获到 ZeroDivisionError: {e}")
finally:
    print("这是 finally 子句,一定会被执行!")

finally 子句也没有特定的参数,它主要用于进行一些清理工作,如关闭文件、释放资源等。

9. 自定义异常及参数说明

在 Python 中,可以自定义异常类。自定义异常类通常继承自 Exception 类。示例如下:

# 定义一个自定义异常类
class MyCustomError(Exception):
    def __init__(self, message):
        self.message = message
        super().__init__(message)

try:
    # 抛出自定义异常
    raise MyCustomError("这是一个自定义异常!")
except MyCustomError as e:
    print(f"捕获到自定义异常:{e.message}")

__init__ 方法:自定义异常类的构造函数,message 是传递给异常的参数,用于描述异常的具体信息。
super().__init__(message):调用父类 Exception 的构造函数,将 message 传递给父类,以便在异常对象中保存该信息。

10. 总结

通过本次知识点的学习,学员应该全面掌握了 Python 中异常处理的基本概念、语法、常见异常类型及其参数,学会了使用 try - except 语句来捕获和处理异常,以及如何使用 finally 和 else 子句进行更复杂的异常处理。同时,也了解了如何自定义异常类并传递参数。异常处理是编写健壮程序的重要组成部分,能够帮助我们处理程序中可能出现的错误,提高程序的稳定性和可靠性。