浅谈python抛出异常、自定义异常, 传递异常

  • Post category:Python

一、Python 异常处理

Python 中的异常是程序运行时出现的错误,例如索引超出范围、除零错误、文件不存在等。Python 提供了异常处理机制,可以处理异常并防止程序崩溃。

1. 抛出异常

在 Python 中,可以使用raise语句手动抛出异常。通常情况下,如果发现某种异常情况,就会抛出相应的异常。

1.1 抛出 ValueError 异常

例如,如果用户输入的是负数,则需要抛出ValueError异常。如下所示:

num = input("Please enter a positive number: ")
if int(num) < 0:
    raise ValueError("Error: negative input.")

上述代码中,如果输入的数字小于 0,则抛出ValueError异常,并提示输入出错。

1.2 抛出自定义异常

另外,我们还可以自定义一些异常,例如MyError异常。如下所示:

class MyError(Exception):
    pass

num = input("Please enter a positive number: ")
try:
    if int(num) < 0:
        raise MyError("Error: negative input.")
except MyError as e:
    print(e)

上述代码定义了一个自定义异常类MyError,然后判断用户输入是否为负数。如果是负数,就抛出MyError异常,并打印出异常信息。

2. 自定义异常

可以通过定义异常类,来自定义异常对象。自定义异常类必须继承自Exception类或其子类,否则将会抛出 TypeError 异常。

下面是一个自定义异常类的示例:

class MyError(Exception):
    def __init__(self, value):
        self.value = value

    def __str__(self):
        return self.value

try:
    raise MyError("This is a custom error message.")
except MyError as e:
    print(e)

上述代码中,自定义了一个异常类MyError,并在__init__方法中返回一个异常信息。通过__str__方法将这个异常信息转为字符串,方便输出。

在主程序中,我们通过raise语句抛出这个自定义异常,并在except代码块中捕获并输出异常信息。

3. 传递异常

有时候,在程序中我们需要调用另外一个函数,并传递可能出现的异常。这时候,需要对异常进行处理,否则程序将会崩溃。例如,如下代码中函数func中调用了函数divide,可能会出现除 0 错误,需要进行异常处理:

def divide(x, y):
    try:
        result = x / y
    except ZeroDivisionError:
        print("division by zero!")
    else:
        print("result is", result)
    finally:
        print("executing finally clause")


def func():
    try:
        divide(9, 0)
    except ZeroDivisionError:
        print("Caught an exception in the main program...")
        raise

func()

上述代码中,我们首先定义了一个除法函数divide,并在其中使用try/except/else/finally语句块。然后在func函数中调用了divide函数,并在try/except语句块中捕获异常。最后,在except代码块中重新抛出异常。

二、总结

本文介绍了 Python 异常处理相关的知识,包括了如何在 Python 中抛出异常、如何自定义异常、如何传递异常。希望大家可以从中了解到 Python 异常处理的基本方法和常用技巧。

三、示例说明

示例一

下面是一个自定义异常的具体使用示例:

class MyError(Exception):
    pass


def func(x):
    if x < 0:
        raise MyError("Negative input.")
    else:
        print("Input is positive.")


try:
    func(-5)
except MyError as e:
    print(e)

上述代码中,我们定义了一个自定义异常类MyError,然后编写了一个函数func,如果函数的输入参数为负数,则抛出自定义异常MyError

在主程序中,我们进行了异常处理,在try/except语句块中捕获了这个异常,并输出了异常信息。

示例二

下面是一个传递异常的具体使用示例:

def divide(x, y):
    try:
        result = x / y
    except ZeroDivisionError:
        print("division by zero!")
    else:
        print("result is", result)
    finally:
        print("executing finally clause")


def func():
    try:
        divide(9, 0)
    except ZeroDivisionError:
        print("Caught an exception in the main program...")
        raise


func()

上述代码中,我们首先定义了一个除法函数divide,并在其中使用try/except/else/finally语句块。然后在func函数中调用了divide函数,并在try/except语句块中捕获异常。最后,在except代码块中重新抛出异常。

上述代码中,我们演示了如何传递异常。在divide函数中,可能会触发ZeroDivisionError异常,但是我们不想在函数中处理该异常,而是将其传递到上层的调用函数中。因此,在func函数中,我们捕获了异常,并重新抛出到主程序中。最终程序输出了捕获到的异常信息。