📜  您在哪里手动创建了异常? (1)

📅  最后修改于: 2023-12-03 15:09:56.101000             🧑  作者: Mango

您在哪里手动创建了异常?

在编写程序时,我们会经常遇到错误和异常,如果不加处理直接让程序终止,可能会导致整个系统崩溃,并造成不必要的损失。为了避免这种情况的发生,我们通常会使用异常处理机制,对于可能产生异常的代码,我们使用try...except关键字对其进行捕获和处理。

除了捕获系统抛出的异常外,我们还可以手动创建异常实例,用于通知程序发生了某种自定义的异常情况。手动创建异常通常需要自定义异常类,并在程序中使用raise关键字抛出异常实例。在哪里手动创建异常,取决于你的业务需求。

下面我们看一下手动创建异常的几个实例:

示例1:在函数中手动创建异常
class MyException(Exception):
    def __init__(self, msg):
        self.msg = msg

def divide(a, b):
    if b == 0:
        raise MyException("除数不能为0!")
    return a/b

try:
    divide(3, 0)
except MyException as e:
    print(e.msg)

在上述代码中,我们定义了一个自定义异常类MyException,在函数divide中如果除数为0,则手动创建MyException异常实例,并将异常实例raise抛出。在try...except中捕获MyException异常,输出异常信息。

示例2:在类中手动创建异常
class Person:
    def __init__(self, name, age):
        if not isinstance(name, str):
            raise ValueError("name必须是字符串类型!")
        if not isinstance(age, int):
            raise ValueError("age必须是整数类型!")
        self.name = name
        self.age = age

try:
    p = Person(123, '23')
except ValueError as e:
    print(e)

在上述代码中,我们在类Person的构造方法中,对传入的参数进行类型检查,如果参数类型不符合要求,手动创建ValueError异常实例,并将异常实例raise抛出。在try...except中捕获ValueError异常,输出异常信息。

示例3:在文件操作中手动创建异常
filename = 'test.txt'

try:
    with open(filename, 'r') as f:
        pass
except FileNotFoundError as e:
    print("文件不存在!")
    raise  # 将异常继续抛出
except Exception as e:
    print("文件打开失败!")
    raise  # 将异常继续抛出

在上述代码中,我们通过with open()语句打开一个文件,在try...except块中捕获文件不存在和文件打开失败两种异常情况。如果文件不存在,手动创建FileNotFoundError异常实例,并输出自定义异常信息;如果文件打开失败,则手动创建Exception异常实例,并输出自定义异常信息。在每个except块中,重新raise抛出异常,以便于调用者继续处理异常。