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

深入理解pydantic.ValidationError()异常类在Python中的作用

发布时间:2023-12-29 18:16:24

pydantic.ValidationError()是pydantic库中定义的一个异常类,用于在数据验证过程中抛出异常。它主要用于描述数据校验失败的原因和位置,并提供了一些方法和属性来进一步处理和分析校验错误。

作用:

1. 异常传递:当使用pydantic模型对数据进行解析或验证时,如果数据不符合模型定义的规则,将抛出pydantic.ValidationError()异常,通过捕获异常,可以获取校验失败的数据和失败的原因,从而进行相应的处理。

2. 数据校验:pydantic.ValidationError()异常类提供了多种方法和属性,便于对校验失败的数据进行处理和分析。例如,可以通过exception.errors()方法获取校验错误的详细信息,通过exception.json()方法获取错误信息的JSON表示等。

下面是一个使用例子,演示了如何使用pydantic.ValidationError()异常类:

from pydantic import BaseModel, ValidationError

class User(BaseModel):
    username: str
    age: int

try:
    data = {
        'username': 'Alice',
        'age': 'twenty'
    }
    user = User(**data)
except ValidationError as e:
    # 校验失败
    print(f"Validation failed: {e.errors()}")
    # 输出:Validation failed: [
    #   {
    #     'loc': ('age',),
    #     'msg': 'value is not a valid integer',
    #     'type': 'type_error.integer'
    #   }
    # ]
    
    # 获取错误信息的JSON表示
    print(f"Validation failed (JSON): {e.json()}")
    # 输出:Validation failed (JSON): [
    #   {
    #     "loc": [
    #       "age"
    #     ],
    #     "msg": "value is not a valid integer",
    #     "type": "type_error.integer"
    #   }
    # ]
    
    # 获取校验失败的字段和原因
    for error in e.errors():
        field = '.'.join(error['loc'])
        reason = error['msg']
        print(f"Validation failed for field '{field}': {reason}")
        # 输出:Validation failed for field 'age': value is not a valid integer

在上面的例子中,我们定义了一个User模型,包含两个字段:username和age。假设我们从外部得到的data数据包含一个非法的年龄值('twenty'),在创建User对象时,由于年龄字段不符合int类型的定义,将抛出pydantic.ValidationError()异常。

在异常处理代码中,我们使用e.errors()方法获取校验错误的详细信息,并进行输出。可以看到,校验错误的详细信息以列表的形式返回,每个错误是一个字典,包含字段(loc)、错误信息(msg)和错误类型(type)等信息。

除了e.errors()方法之外,还可以使用e.json()方法将错误信息转换为JSON格式,方便传输和存储。另外,通过遍历e.errors()列表,我们可以获取每个错误的具体字段和错误原因,并进行相应的处理。