📜  Python中用户定义的异常及示例(1)

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

Python中用户定义的异常及示例

在Python中,除了内置的异常类和标准库所提供的异常,我们也可以自定义异常类来描述程序的特定错误或异常情况。本文将介绍Python中用户定义的异常及其使用示例。

自定义异常类的基本语法

自定义异常类需要继承Exception类或其子类,并至少实现__init__方法和__str__方法。其中__init__方法用于初始化异常实例,__str__方法用于定义当该异常被打印时所显示的字符串。

示例
class MyError(Exception):
    def __init__(self, message):
        self.message = message
    
    def __str__(self):
        return f"自定义异常:{self.message}"

在上述示例中,我们定义了一个名为MyError的自定义异常类,它继承于Exception类。该类覆盖了__init____str__方法,__init__方法用于初始化异常实例,接收一个参数message表示异常信息;__str__方法用于定义当该异常被打印时所显示的字符串。

抛出自定义异常

在定义了自定义异常类之后,我们可以使用raise语句将该异常抛出,示例如下:

try:
    raise MyError("这是一个自定义异常示例")
except MyError as e:
    print(e)

在上述示例中,我们使用raise语句将MyError异常抛出,并接收该异常的实例。在except分支中,我们打印该异常的实例,程序将输出:自定义异常:这是一个自定义异常示例

自定义异常的作用

通过自定义异常类,我们可以将不同类型的错误或异常情况区分开来,使得程序的异常处理更为精细化和清晰化。例如,在开发Web应用时,我们可以定义多个不同的HTTP异常类,用于对不同的HTTP响应状态码进行区分和处理。

示例

下面我们来看一个使用自定义异常类的Web应用示例:

class HTTPException(Exception):
    status_code = None
    def __init__(self, message):
        self.message = message
        
    def __str__(self):
        return f"HTTP {self.status_code}: {self.message}"
    
class BadRequest(HTTPException):
    status_code = 400
    
class Forbidden(HTTPException):
    status_code = 403
    
class NotFound(HTTPException):
    status_code = 404
    
def handle_request(path):
    if path == "admin":
        raise Forbidden("您无权访问该页面")
    elif path == "index":
        return "欢迎访问首页"
    else:
        raise NotFound("您访问的页面不存在")
    
try:
    handle_request("admin")
except HTTPException as e:
    print(e)

在上述示例中,我们定义了一个名为HTTPException的基类,以及三个子类BadRequestForbiddenNotFound,分别表示HTTP响应状态码为400、403和404的异常情况。我们还定义了一个handle_request函数,用于模拟Web应用中的请求处理过程。在该函数中,如果请求的路径为admin,我们将抛出一个Forbidden异常;如果请求的路径为index,我们将返回一个欢迎页面;否则,我们将抛出一个NotFound异常。

在主程序中,我们调用handle_request函数,并使用try语句捕获可能抛出的HTTPException异常,并打印该异常的实例。如果我们访问的是admin页面,程序将输出:HTTP 403: 您无权访问该页面;如果访问的是一个不存在的页面,程序将输出:HTTP 404: 您访问的页面不存在

总结

通过自定义异常类,我们可以将程序中的不同类型的错误或异常情况区分开来,从而提高程序的异常处理精细化程度和清晰性。在实际开发中,我们可以根据需要,定义属于自己的一套异常类型,并将错误信息精细地呈现给用户或开发者,以便于诊断和解决问题。