在编写程序时,难免会遇到各种异常情况。Python 提供了一系列内置的异常类型,可以用于捕获和处理不同类型的错误。了解这些常见的异常类型有助于编写健壮的代码。
1. 常见的异常类型
IndexError
当尝试访问列表、元组或其他序列中不存在的索引时,会引发 IndexError
。
my_list = [1, 2, 3]
try:print(my_list[3])
except IndexError as e:print(f"发生异常:{e}")
KeyError
当尝试访问字典中不存在的键时,会引发 KeyError
。
my_dict = {'a': 1, 'b': 2}
try:print(my_dict['c'])
except KeyError as e:print(f"发生异常:{e}")
ValueError
当函数接收到的参数类型不正确时,会引发 ValueError
。
try:number = int("abc")
except ValueError as e:print(f"发生异常:{e}")
TypeError
当操作或函数应用于错误类型的对象时,会引发 TypeError
。
try:result = "abc" + 123
except TypeError as e:print(f"发生异常:{e}")
ZeroDivisionError
当尝试除以零时,会引发 ZeroDivisionError
。
try:result = 10 / 0
except ZeroDivisionError as e:print(f"发生异常:{e}")
FileNotFoundError
当尝试打开不存在的文件时,会引发 FileNotFoundError
。
try:with open('non_existent_file.txt', 'r') as file:content = file.read()
except FileNotFoundError as e:print(f"发生异常:{e}")
2. 捕获多个异常
可以在一个 try
语句中捕获多个异常,并分别处理它们。
try:x = int(input("请输入一个数字:"))y = 10 / xprint(y)
except ValueError as e:print(f"输入值必须是数字。异常信息:{e}")
except ZeroDivisionError as e:print(f"除数不能为零。异常信息:{e}")
3. 捕获所有异常
可以使用 except Exception
来捕获所有异常,处理未知错误。
try:result = 10 / 0
except Exception as e:print(f"发生异常:{e}")
4. 抛出异常
可以使用 raise
关键字手动引发异常,常用于验证函数参数。
def check_positive(number):if number <= 0:raise ValueError("数字必须是正数")return numbertry:check_positive(-10)
except ValueError as e:print(f"发生异常:{e}")
5. 自定义异常
可以通过继承 Exception
类来自定义异常。
class CustomError(Exception):passdef check_value(value):if value < 0:raise CustomError("值不能为负数")try:check_value(-5)
except CustomError as e:print(f"发生异常:{e}")
可运行的Python案例
下面是一个完整的Python程序,演示了常见异常类型的捕获和处理。
# 处理 IndexError 异常
my_list = [1, 2, 3]
try:print(my_list[3])
except IndexError as e:print(f"IndexError 发生:{e}")# 处理 KeyError 异常
my_dict = {'a': 1, 'b': 2}
try:print(my_dict['c'])
except KeyError as e:print(f"KeyError 发生:{e}")# 处理 ValueError 异常
try:number = int("abc")
except ValueError as e:print(f"ValueError 发生:{e}")# 处理 TypeError 异常
try:result = "abc" + 123
except TypeError as e:print(f"TypeError 发生:{e}")# 处理 ZeroDivisionError 异常
try:result = 10 / 0
except ZeroDivisionError as e:print(f"ZeroDivisionError 发生:{e}")# 处理 FileNotFoundError 异常
try:with open('non_existent_file.txt', 'r') as file:content = file.read()
except FileNotFoundError as e:print(f"FileNotFoundError 发生:{e}")# 捕获多个异常
try:x = int(input("请输入一个数字:"))y = 10 / xprint(y)
except ValueError as e:print(f"输入值必须是数字。异常信息:{e}")
except ZeroDivisionError as e:print(f"除数不能为零。异常信息:{e}")# 捕获所有异常
try:result = 10 / 0
except Exception as e:print(f"发生异常:{e}")# 手动引发异常
def check_positive(number):if number <= 0:raise ValueError("数字必须是正数")return numbertry:check_positive(-10)
except ValueError as e:print(f"手动引发的异常:{e}")# 自定义异常
class CustomError(Exception):passdef check_value(value):if value < 0:raise CustomError("值不能为负数")try:check_value(-5)
except CustomError as e:print(f"CustomError 发生:{e}")
可以将上面的代码复制到你的IDE中运行,观察程序的输出。这个案例综合了常见异常类型及其处理方法,帮助你理解和掌握这些操作。继续加油,学习Python会越来越有趣和有用!