Skip to content

异常处理


简介

编写程序时,即使语句或表达式使用了正确的语法,执行时仍可能触发错误。执行时检测到的错误称为异常,大多数异常不会被程序处理,程序会中断运行,并抛出异常信息。

如果不想发生异常时,程序被中断执行,可以编写程序处理选定的异常。


捕获异常

Python 使用 try/except语句捕获异常。

try/except 语句用来检测 try 语句块中的错误,从而让 except 语句捕获异常信息并处理。

如果你不想在异常发生时结束你的程序,只需在 try 里捕获它。

file = open("data.txt","r")
try:
    # 写入数据时可能会有问题
    file.write("写入的数据")
except IOError as err:
    print("文件不能写入", err)

file.close()

捕捉多个异常

如果一段代码可能会发生多种异常,并想在程序中都想处理,可以使用多个 except 分别捕捉异常。

可以捕捉 Exception 异常类型来处理所有的异常,如果有多个时,必须放在最后捕捉该异常,否则无法处理到其它异常。

file = open("data.txt","r")
try:
    # 写入数据时可能会有问题
    # file.write("写入的数据")
    # print(a)
    # print(3 / 0)
    # print([][10])
    print("hello" + 100)
except IOError as err:
    print("文件不能写入", err)
except NameError:
    print("标识符没有定义")
except ZeroDivisionError:
    print("除数不能为0")
except IndexError:
    print("下标越界了")
except Exception:
    print("程序运行出错,请检查代码")
file.close()

else 操作

Python 使用 else 在处理在代码无异常时的后续操作。

try:
    n = input("请输入一个数字:")
    num = int(n)
except Exception:
    print("元素无法转换为数字")
else:
    print("转换后成功",num)

finally 操作

Python 使用 finally 处理无论异常是否发异,都要执行的代码,一般用来完成清理工作。

try:
   file = open("data.txt","r")
   # file.write("A")
except Exception:
    print("文件操作报错")
finally:
    print("文件已关闭")
    file.close()

抛出异常

抛出异常 就是主动生成一个异常对象,并将其传递到调用栈中,这样程序就会跳转到相应的 except 代码块,或者终止执行并显示错误信息。抛出异常通常使用 raise 语句。

raise Exception("错误消息")

抛出指定的异常类型

可以通过 raise 语句抛出不同类型的异常。例如,ValueError、TypeError、FileNotFoundError 等。还可以自定义异常类,抛出自己的异常类型。

def check_age(age):
    if age < 0:
        # 抛出 ValueError 异常
        raise ValueError("年龄不能为负数")  
    print(f"年龄是 {age}")

# 调用函数
try:
    check_age(-5)  # 会抛出 ValueError 异常
except ValueError as e:
    print(f"捕获到异常:{e}")

自定义异常

  1. 继承 Exception 类: Python 中的异常类都是继承自内置的 Exception 类,因此我们可以通过继承 Exception 类来创建自己的异常类。
  2. 添加构造方法(__init__): 自定义异常类通常会添加构造方法,允许我们在抛出异常时传递额外的信息,比如错误消息或其他重要的上下文信息。
  3. 可选:重写 __str____repr__ 方法:可以重写 __str__ 方法来定制异常的输出格式,让错误信息更易于理解。
# 自定义异常类
class NegativeAmountError(Exception):
    def __init__(self, message="订单金额不能为负!"):
        # 异常消息
        self.message = message
        # 调用父类构造函数 
        super().__init__(self.message)  

# 函数:处理订单
def process_order(amount):
    if amount < 0:
        # 抛出自定义异常
        raise NegativeAmountError(f"无效金额:{amount}")  
    print(f"订单金额:{amount} 处理成功!")

# 使用自定义异常
try:
    # 传递负数金额,会触发自定义异常
    process_order(-10)  
except NegativeAmountError as e:
    print(f"错误: {e}")

总结

  • 捕捉异常
  • 抛出异常
  • 自定义异常