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 子句进行更复杂的异常处理。同时,也了解了如何自定义异常类并传递参数。异常处理是编写健壮程序的重要组成部分,能够帮助我们处理程序中可能出现的错误,提高程序的稳定性和可靠性。