假设我有一些孤立的Python代码来处理由其他实体(例如客户端)生成的数据。
我收到的数据可能是不正确的形式(例如由于客户端的邋iness,数据损坏,你给它命名),因此我的Python代码中的处理会以某种方式失败,这将导致引发一些异常。让我们假设下游代码只是想知道处理是否正确和错误,而不是为什么它是错误的。
我关注的是:在复杂错误输入上引发此类异常的最佳做法是什么?在这种情况下如何组织例外?
数据可能在很多方面都是错误的,特别是如果数据的正确格式很复杂。在某些情况下,我可能很容易自己捕获错误(例如,如果我发现一个不正确的魔法值,在这种情况下我可能会提高我的FancyCustomizedException
),但在其他情况下,一些一般的异常也会被提升(例如一些{{ 1}})。
如果引发任何异常,可以说处理是错误的(在这种情况下,下游代码将使用非常通用(和丑陋)ValueException
)?
抓住所有通用异常并将其隐藏在我的try: ... except: ...
中是否更好(在这种情况下,下游代码将使用非常通用的FancyCustomizedException
,但我会垃圾我的代码与try: ... except FancyCustomizedException, e: ...
)?
答案 0 :(得分:2)
由于您似乎需要进行相当多的验证,我只需将所有验证“错误”包装在 ValidationSummary 对象/实例(包含所有出错的列表)中的给定输入上并改为传递它。
更一般地说:与其他语言相反,通过异常处理构建程序流是常见的并且在Python中被接受。与此相关的Python习语称为EAFP(请求宽恕然后权限更容易)。
答案 1 :(得分:1)
恕我直言最好创建自己的异常层次结构,并在每种情况下抛出具体的异常,例如BaseValidationException,用于泛型验证异常,如ValueXException等。自定义异常的其他层次结构等等。然后,你如果你想要,可以根据基数或特定例外情况进行捕获......
ProcessException
+ ValidationException
+ ValueXException
+ LimitYException
+ FancyCustomExceptionA
+ FancyCustomDetailException
+ FancyOtherExtensionB
...
你总是可以通过ProcessException过滤,或者捕获特定的例外......
答案 2 :(得分:0)
在我看来,使用异常比从函数返回错误代码更可靠。原因是测试返回的值会使调用周围的代码更加难以理解,而且往往不会检查它。所以,去寻找例外。
如果您不确定,请仅使用通用异常 - 即不要创建自己的异常类。您可以随时添加它们。最好更多地考虑异常应该是什么类型(现有异常),而不是创建它们中的许多新异常。
您可以编写代码,使其具有抱怨所有出错的核心(通过例外)。然后,您可以编写一个更宽容的图层,并尝试聪明来解决某些情况。 (但是,有时软件的聪明可能会让用户发疯:)