欢迎访问宙启技术站
智能推送

Python异常处理函数教程:学会使用try和except关键字来处理异常情况,并编写自己的异常处理函数。

发布时间:2023-06-04 16:16:40

在Python编程中,难免会遇到各种各样的错误,例如除以0、数组越界、文件不存在等等。这些错误会导致程序崩溃或者输出错误结果,给程序的调试和维护带来许多困难。为了解决这些问题,Python提供了异常处理机制。在本文中,我们将学习如何使用Python的异常处理函数,并编写我们自己的异常处理函数。

1. try-except语句

Python中使用try-except语句来实现异常处理。try语句包含需要被检测的代码块,而except语句包含处理异常情况的代码块。如果try语句中的代码出现错误,那么Python会自动跳转到对应的except语句执行。以下是try-except语句的基本格式:

try:
    # 可能出现错误的代码
except ExceptionType:
    # 处理异常情况的代码

其中,ExceptionType为需要捕捉的异常类型,可以是任何Python中定义的异常类型。如果没有指定ExceptionType,则默认捕捉所有异常。

下面是一个例子,我们尝试除以0。由于除以0会导致程序错误,因此程序会抛出ZeroDivisionError异常,我们使用try-except语句来处理这个异常:

try:
    result = 1 / 0
except ZeroDivisionError:
    print("Error: division by zero")

上述代码中,try语句中的result = 1 / 0会导致ZeroDivisionError异常,因此程序会跳转到except语句中执行。except语句中的print函数会输出“Error: division by zero”。

2. 多个except语句

除了捕捉单个异常类型外,我们还可以使用多个except语句来分别处理多个异常类型。该语句形式如下:

try:
    # 可能出现错误的代码
except ExceptionType1:
    # 处理ExceptionType1类型的异常情况的代码
except ExceptionType2:
    # 处理ExceptionType2类型的异常情况的代码
except ExceptionType3:
    # 处理ExceptionType3类型的异常情况的代码

下面是一个例子,我们分别处理ZeroDivisionError和TypeError类型的异常。

try:
    result = 1 / 'a'
except ZeroDivisionError:
    print("Error: division by zero")
except TypeError:
    print("Error: unsupported operand type(s) for /: 'int' and 'str'")

上述代码中,result = 1 / 'a'会导致TypeError异常,因此程序会跳转到except TypeError语句中执行。except语句中的print函数会输出“Error: unsupported operand type(s) for /: 'int' and 'str'”。

3. try-except-else语句

在一些情况下,我们需要在try语句中的代码块执行完后再执行一些特定的代码,这时可以使用try-except-else语句。else语句块中的代码只有在try块中没有产生异常时才会被执行。

下面是一个例子,我们尝试打开不存在的文件,并输出文件中的内容。如果文件不存在,程序会抛出FileNotFoundError异常,并执行except内的代码。否则,程序将会打印文件中的内容。

try:
    with open('test.txt', 'r') as f:
        print(f.read())
except FileNotFoundError:
    print("Error: file not found")
else:
    print("File opened successfully")

上述代码中,如果文件test.txt不存在,则程序会跳转到except语句块中执行,输出“Error: file not found”。否则程序会跳转到else语句块中执行,输出“File opened successfully”。

4. try-except-finally语句

有时候,我们需要确保一些代码不管是否产生异常都会被执行到,比如关闭资源文件等。这时,可以使用try-except-finally语句。finally语句块中的代码无论是否出现异常都会被执行。

下面是一个例子,我们尝试打开资源文件,并在程序执行完成后关闭资源文件。无论是否出现异常,程序都会执行finally语句块中的代码来关闭资源文件。

try:
    f = open('test.txt', 'r')
    print(f.read())
except FileNotFoundError:
    print("Error: file not found")
finally:
    f.close()

上述代码中,如果文件test.txt不存在,则程序会跳转到except语句块中执行,输出“Error: file not found”。否则程序会输出文件中的内容,然后跳转到finally语句块关闭文件。

5. 自定义异常

除了使用Python自带的异常类型外,我们还可以自定义异常类型来使程序更加易读。自定义异常类型需要继承Python的Exception类,并重载__str__方法。

下面是一个例子,我们定义一个自定义的DivideError异常类型,并在程序中使用该异常类型。

class DivideError(Exception):
    def __str__(self):
        return "Error: division by zero"

try:
    result = 1 / 0
except ZeroDivisionError:
    raise DivideError()

上述代码中,我们定义了一个名为DivideError的异常类型,并重载了__str__方法。在程序中,如果出现ZeroDivisionError异常,就会抛出DivideError异常。

6. 自定义异常处理函数

在某些情况下,我们需要根据具体的业务逻辑来定义自己的异常处理函数。可以使用Python的装饰器(decorator)来定义异常处理函数。在函数上添加@decorator语句,就可以将该函数作为异常处理函数,在程序抛出异常时被调用。

下面是一个例子,我们定义了一个名为exception_handler的异常处理函数,并使用@exception_handler语句来将该函数添加为异常处理函数。

def exception_handler(func):
    def wrapper(*args, **kwargs):
        try:
            return func(*args, **kwargs)
        except Exception as e:
            print("Error:", str(e))
            # 具体的异常处理代码
    return wrapper

@exception_handler
def divide(a, b):
    return a / b

result = divide(1, 0)

上述代码中,我们定义了一个名为exception_handler的异常处理函数,并使用装饰器将其添加为异常处理函数。在程序中,如果出现除以0的异常,就会调用exception_handler函数对该异常进行处理。

总结

本文介绍了Python中的异常处理机制。通过学习本文,我们可以使用try-except语句来实现异常处理,在程序出现异常时进行处理。同时,我们还学习了如何使用多个except语句、try-except-else语句和try-except-finally语句来处理异常。最后,我们还学习了如何自定义异常类型和异常处理函数,使程序更加易读和易于维护。