【问题标题】:Should a function that normally returns list return a negative int on an exception?通常返回列表的函数是否应该在异常时返回负整数?
【发布时间】:2016-04-16 14:33:23
【问题描述】:

如果我有一个读取文件并返回值列表的函数,但该文件不存在,或者为进程设置了读取权限,或者任何其他类型的异常,最好:

  1. 让异常自然发生
  2. 尝试/捕获异常并将错误打印为字符串,并返回 -1 或其他一些失败 int
  3. 尝试/捕获异常并且不打印任何内容,但返回 -1
  4. 尝试/捕获异常并返回空列表(具有误导性)
  5. 别的东西

在这种情况下,如果重要的话,我们说的是 Python。

【问题讨论】:

  • 也许您应该使用 pytest 或 unittest 为您的脚本编写测试,尽可能多地有效地破坏它。每次代码中断时,在脚本中构建适当的异常处理。我喜欢亲自打印错误,因为它为用户/开发人员提供了关于发生了什么问题的线索。决定回报是什么,并围绕它设计程序。
  • 在我看来,这取决于函数的作用以及在某种程度上谁将运行您的代码。如果该功能是必要的操作并且程序没有它就无法继续,我会抛出一个错误。如果没有必要并且操作可以在没有它的情况下继续,则捕获错误,可能会打印警告并返回 -1 以让任何调用它知道它失败了。如果您的代码由 python 开发人员运行,您可以让异常发生。如果您期望非技术用户,请抓住它并打印一条合理的错误消息。

标签: python exception-handling


【解决方案1】:

答案并不是真正的 Python 特定的。关于异常的一般规则是,您应该只在可以采取措施从中恢复的上下文中捕获它们:例如每 10 秒重试一次,最多 3 次,这是有意义的,或者询问用户他们想要做什么:重试,中止? 如果捕获异常的函数无法合理恢复,最好让异常“冒泡”。有时,如果捕获异常的上下文可以添加额外的有用信息,您可以捕获异常,添加有意义的信息并重新抛出不同的、更有意义的异常。这真的取决于你想要做什么。 请注意,返回无效值是错误处理的不同范例,在某些情况下它是有意义的,但一般来说,像您描述的失败最好通过异常处理。

【讨论】:

    【解决方案2】:
    1. 让异常自然发生。

    由调用者决定要做什么,因此向调用者提供它需要的信息(例外情况)并让它决定。传递返回码只会丢失信息,并且容易出错。

    【讨论】:

      【解决方案3】:

      如果您可以保证函数将始终能够完全正确处理异常,然后在函数本身中处理异常并在失败时返回 None,因为空列表可能是有效的返回,而 None 比整数返回代码更 Pythonic。

      但是,您很可能无法做出这样的保证,因此您应该允许异常冒泡给调用者。或者,您可能会通过捕获异常、对其执行一些分析(可能打印警告消息)然后重新引发异常,或者引发带有额外错误/警告信息的修改版本来妥协。

      这符合古代程序员的谚语:

      切勿测试您不知道如何处理的错误情况。

      :)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-05
        • 2011-10-21
        • 1970-01-01
        • 1970-01-01
        • 2011-04-27
        相关资源
        最近更新 更多