【问题标题】:ValidationError or TypeError, ValueError - ExceptionsValidationError 或 TypeError、ValueError - 异常
【发布时间】:2019-07-02 17:59:00
【问题描述】:

对于如何在 python 中捕获异常,我是个新手。我对这两种捕获异常的方法有疑问。我只找到了有关here 的ValidationError 的有用信息

但我不太明白它是否可以在 django 之外使用,或者我可以预期的错误消息是什么。我看到了这个关于类型验证的代码示例。

except (TypeError, ValueError) as error:
            LOGGER.error('Error e.g.', exc_info=True)

except ValidationError:
            LOGGER.error('Error e.g', exc_info=True)

所以对于我来说TypeErrorValueError,很明显:

异常值错误

当操作或函数接收到具有正确类型但值不适当的参数时引发,并且该情况没有由更精确的异常(例如 IndexError)描述。

异常类型错误

当操作或函数应用于不适当类型的对象时引发。关联的值是一个字符串,提供有关类型不匹配的详细信息。

总之, 我试图了解ValidationError 的第二个代码的优势是什么,但这可能会很棘手,因为我没有找到好的文档。如果有人可以分享有关 ValidationError 的知识,我将不胜感激,

我提出这个问题是因为我要使用相关的库,我还没有看到异常被这样处理。

https://pypi.org/project/related/

感谢社区!

【问题讨论】:

  • 您可能不清楚的地方:TypeErrorValueError 内置于 Python 中。但是库可以并且经常会定义自己的异常。 ValidationError 来自您正在使用的库。
  • 要搜索异常,您应该查看库的文档而不是异常,因为它本身没有文档
  • @Anonymous 是的,我提出这个问题是因为我开始了解一个名为related 的新库,以便进行验证pypi.org/project/related
  • @may OK 那么你就可以看到文件中的异常并找到语句
  • 引发验证错误

标签: python django exception error-handling django-validation


【解决方案1】:

它们是用于处理不同异常的不同代码块。

但在本例中,两种情况在处理每个异常时的逻辑相同。

如果我们将案例分成 3 个不同的代码块可能更有意义:

except TypeError as error:
    LOGGER.error('Type error: ', exc_info=True);
except ValueError as error:
    LOGGER.error('Value error: ', exc_info=True);
except ValidationError error:
    LOGGER.error('Validation error: ', exc_info=True);

TypeError会在使用不正确的类型时抛出

ValueError会在使用不正确的值时抛出

验证失败时会抛出ValidationError

程序会以不同的方式处理每个异常

【讨论】:

  • 但是我猜这个 ValidationError 不支持所有的验证过程,因为我正在使用这个名为 related 的新库,并且这里没有列出这种类型的异常,例如。
【解决方案2】:

可以通过这种方式捕获 Python 异常:

try:
<your code>
except <Exception>:
    <CODE 2>

或 喜欢这个

try:
    <your code>
except(<exception1>,<exception2>):
    <Code to handle exception>

您只是一起处理多个异常。你可以 总是把它们分开。它们不是两种不同的方式。 在您的情况下, as 用于记录它。

这里有几个例子:

try:
    <code>
except TypeError:
    <Code for handling exception>
except ValueError:
    <Code for handling exception>
except ValidationError:
    <Code for handling exception>
except:
    <Code for handling exception>

在最后一种情况下,它捕获任何类型的异常,因为没有指定类型。
在 Python 中,程序可以为任何事物引发任何异常。
事实上异常只是一个特殊的类,甚至你可以为你的库创建一个。

因此,查找异常的最佳方法是阅读库的文档 不是异常类。

如果您的程序捕获到异常并希望获得有关它的更多详细信息以创建日志文件,则可以这样编写代码。

except TypeError as e:
    i=str(e)

在这种情况下,您将捕获异常并将其详细信息转换为字符串。
这是来自 Django 文档,关于您正在谈论的错误。

表单验证在数据被清理时发生。如果你想 自定义这个流程,有很多地方可以修改,每个 一个服务于不同的目的。三种清洁方法是 在表单处理期间运行。这些通常在您调用时执行 表单上的 is_valid() 方法。还有其他的东西也可以 触发清理和验证(访问错误属性或 直接调用 full_clean()),但通常不需要它们。

一般来说,任何清理方法都会引发 ValidationError 如果存在 它正在处理的数据有问题,通过相关的 ValidationError 构造函数的信息。最好看下面 实践提高 ValidationError。如果没有引发 ValidationError, 该方法应以 Python 形式返回已清理(标准化)的数据 对象。

一些进一步的参考:

The link to docs
This link has info about other common builtin exception classes.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-08
    • 2022-01-07
    • 1970-01-01
    • 1970-01-01
    • 2014-09-15
    • 1970-01-01
    相关资源
    最近更新 更多