0

假设我有一些独立的 Python 代码来处理由其他实体(例如客户端)生成的数据。

我收到的数据可能格式不正确(例如,由于客户端的马虎、数据损坏等),因此我的 Python 代码中的处理会以某种方式失败,这将导致引发一些异常。让我们假设下游代码只是想知道处理是否正确和错误,而不是为什么出错。

我关心的是:在复杂的错误输入上引发此类异常的最佳做法是什么?在这种情况下如何组织异常?

数据在很多方面可能会被证明是不正确的,尤其是在数据的正确格式很复杂的情况下。在某些情况下,我自己可能很容易发现错误(例如,如果我发现不正确的魔法值,在这种情况下我可能会提高我的FancyCustomizedException),但在其他情况下,也可能会引发一些通用异常(例如 some ValueException)。

如果引发任何异常,是否可以说处理错误(在这种情况下,下游代码将使用非常通用的(和丑陋的)try: ... except: ...)?

捕获所有通用异常并将它们隐藏在我的内部是否更好FancyCustomizedException(在这种情况下,下游代码将使用非常不通用的代码,但会在代码中try: ... except FancyCustomizedException, e: ...乱扔)?try: ... except: ...

4

3 回答 3

2

由于您似乎需要相当多的验证,我只需将给定输入上的所有验证“错误”包装在ValidationSummary对象/实例(其中包含所有出错的列表)中,然后将其传递。

更笼统地说:与其他语言相反,通过异常处理来构建程序流在 Python 中很常见并被接受。与此相关的 Python 习语称为 EAFP(请求宽恕比许可更容易)。

于 2012-04-27T07:26:18.083 回答
1

恕我直言,最好创建您自己的异常层次结构,并在每种情况下引发具体异常,例如,BaseValidationException,用于通用验证异常,如 ValueXException 等。其他层次结构用于自定义异常等。然后,您可以捕获基于如果您愿意,可以在基础或特定例外情况下...

ProcessException
  + ValidationException
    + ValueXException
    + LimitYException
  + FancyCustomExceptionA
    + FancyCustomDetailException
  + FancyOtherExtensionB
    ...

您始终可以按 ProcessException 过滤,或捕获特定异常...

于 2012-04-27T08:38:14.803 回答
0

在我看来,使用异常比仅仅从函数返回错误代码更可靠。原因是测试返回值会使调用周围的代码更加不可读,并且人们往往不会检查它。所以,去寻找例外。

如果您不确定,请仅使用通用异常——即不要创建您自己的异常类。您以后可以随时添加它们。最好多考虑一下异常应该是什么类型(现有的),而不是创建很多新的异常。

您可以编写代码,使其具有抱怨所有错误的核心(通过异常)。然后你可以写一个更宽容的层,并尝试聪明地解决一些情况。(不过,有时软件的聪明可能会让用户抓狂:)

于 2012-04-27T08:01:58.673 回答