• 周二. 2月 7th, 2023

Python 异常处理语句详细用法

城主

12月 25, 2022 ,

在 Python 中,异常是通常是通过 tryexcept 语句来处理的。

下面是一个简单的例子,展示了如何使用这些语句来处理异常:





def divide(a, b):
    try:
        result = a / b
    except ZeroDivisionError:
        print("division by zero!")
    else:
        print(f"result is {result}")
    finally:
        print("executing finally clause")

divide(2, 1)
# Output: result is 2.0
#         executing finally clause

divide(2, 0)
# Output: division by zero!
#         executing finally clause

divide("2", "1")
# Output: executing finally clause
#         TypeError: unsupported operand type(s) for /: 'str' and 'str'

在这个例子中,我们定义了一个函数 divide,它接受两个参数 ab 并尝试做除法运算。

try 块中,我们执行除法运算并将结果存储在变量 result 中。如果这个运算出现了 ZeroDivisionError 异常,那么程序会跳转到 except 块中并打印一条消息。如果没有异常发生,那么程序会跳转到 else 块中并打印结果。最后,finally 块中的代码总是会执行,无论是否发生了异常。

注意,在最后一个例子中,我们尝试将字符串相除,这会导致另一种类型的异常——TypeError。由于没有为这种类型的异常提供处理程序,因此程序会中止并显示错误消息。

你可以使用多个 except语句来处理不同类型的异常,例如:





def divide(a, b):
    try:
        result = a / b
    except ZeroDivisionError:
        print("division by zero!")
    except TypeError:
        print("operand type(s) not supported for division")
    else:
        print(f"result is {result}")
    finally:
        print("executing finally clause")

divide(2, 1)
# Output: result is 2.0
#         executing finally clause

divide(2, 0)
# Output: division by zero!
#         executing finally clause

divide("2", "1")
# Output: operand type(s) not supported for division
#         executing finally clause

在这个例子中,我们添加了一个额外的 except 语句,用于处理 TypeError 异常。这样,当我们尝试将字符串相除时,程序就会跳转到这个 except 语句中,并打印一条错误消息。

阅读  Python 文档生成工具的使用

如果你想要在 except 语句中获取有关异常的更多信息,可以使用如下语法:





except ExceptionType as exception:
    # code to handle the exception

其中 ExceptionType 是异常的类型,exception 是一个异常对象,它包含有关异常的详细信息。你可以使用这个对象的属性和方法来获取有关异常的信息。

例如,你可以使用 exception.args 属性来获取异常的参数列表,或者使用 exception.__str__() 方法来获取异常的字符串表示。

举个例子:





def divide(a, b):
    try:
        result = a / b
    except ZeroDivisionError as e:
        print("division by zero! Exception args:", e.args)
    except TypeError as e:
        print("operand type(s) not supported for division. Exception args:", e.args)

另外,你还可以使用 raise 关键字来显式地引发异常。这样做可以用来报告特定的错误或终止程序执行。

例如,你可以使用如下语法来引发 ValueError 异常:





raise ValueError("invalid value")

你也可以使用 raise 语句来重新引发已经被捕获的异常。这可以用来继续传递异常,以便在更高层次处理。

例如,你可以使用如下语法来重新引发已经被捕获的异常:





try:
    # code that might raise an exception
except Exception as e:
    # code to handle the exception
    raise

在这个例子中,如果发生了异常,那么程序会跳转到 except 块中并执行处理程序。然后,程序会使用 raise 语句重新引发异常,使它能够在更高层次被处理。

阅读  python 枚举类型的详细使用方法

注意,在使用 raise 语句重新引发异常时,你应该省略异常的类型和参数。这是因为这些信息已经在捕获异常时存储在变量中,因此可以直接使用。

例如,你可以使用如下语法来重新引发已经被捕获的异常:





try:
    # code that might raise an exception
except Exception as e:
    # code to handle the exception
    raise

在 Python 中,还有一种用于处理异常的方法——使用上下文管理器和 with 语句。

上下文管理器是一种特殊的对象,它实现了 __enter____exit__ 方法。当使用 with 语句时,会自动调用上下文管理器的 __enter__ 方法,并在 with 块执行完毕后调用 __exit__ 方法。

举个例子,你可以使用如下语法来打开文件并读取其内容:





with open("file.txt") as f:
    for line in f:
        print(line)

在这个例子中,open 函数返回一个文件对象,该对象实现了上下文管理器协议。因此,你可以使用 with 语句来自动打开和关闭文件。

你还可以使用 with 语句来处理异常。例如,你可以使用如下语法来处理文件打开失败的情况:





try:
    with open("file.txt") as f:
        for line in f:
            print(line)
except FileNotFoundError:
    print("file not found")

在这个例子中,如果打开文件失败,那么会引发 FileNotFoundError 异常。程序会跳转到 except 块中并打印一条消息。

注意,使用 with 语句处理异常的方法通常比使用 tryexcept 语句更简单,因为它可以自动执行资源管理和异常处理。

阅读  Python 网络编程的详细用法