Python 通常返回list的函数是否应该在异常时返回负int?

Python 通常返回list的函数是否应该在异常时返回负int?,python,exception-handling,Python,Exception Handling,如果我有一个读取文件并返回值列表的函数,但该文件不存在,或者为进程设置了读取权限,或者任何其他类型的异常,那么最好: 让异常有机地发生 尝试/捕获异常并将错误打印为字符串,然后返回-1或其他故障int 尝试/捕获异常并不打印任何内容,但返回-1 尝试/捕获异常并返回空列表(这有误导性) 别的 在本例中,如果Python很重要的话,我们就是在谈论Python 让异常有机地发生 这取决于调用者决定要做什么,所以给调用者它需要的信息-异常-并让它决定。传递返回码只会丢失信息,并且容易出错 让异常有机地

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

  • 让异常有机地发生
  • 尝试/捕获异常并将错误打印为字符串,然后返回-1或其他故障int
  • 尝试/捕获异常并不打印任何内容,但返回-1
  • 尝试/捕获异常并返回空列表(这有误导性)
  • 别的
  • 在本例中,如果Python很重要的话,我们就是在谈论Python

  • 让异常有机地发生
  • 这取决于调用者决定要做什么,所以给调用者它需要的信息-异常-并让它决定。传递返回码只会丢失信息,并且容易出错

  • 让异常有机地发生

  • 这取决于调用者决定要做什么,所以给调用者它需要的信息-异常-并让它决定。传递返回码只会丢失信息,并且容易启动。

    答案并不是特定于Python的。关于异常的一般规则是,您只应在可以执行某种操作以从中恢复的上下文中捕获异常:例如,在有意义的情况下,每10秒重试一次,最多3次,或者询问用户希望执行的操作:重试、中止? 如果捕获异常的函数无法正常恢复,最好让异常“冒泡”。有时候,如果捕获异常的上下文可以添加其他有用的信息,那么您可以捕获异常,添加有意义的信息,然后重新抛出一个不同的、更有意义的异常。这真的取决于你想做什么。
    请注意,返回无效值是一种不同的错误处理模式,在某些情况下是有意义的,但一般来说,通过异常可以更好地处理您所描述的故障。

    答案并非特定于Python。关于异常的一般规则是,您只应在可以执行某种操作以从中恢复的上下文中捕获异常:例如,在有意义的情况下,每10秒重试一次,最多3次,或者询问用户希望执行的操作:重试、中止? 如果捕获异常的函数无法正常恢复,最好让异常“冒泡”。有时候,如果捕获异常的上下文可以添加其他有用的信息,那么您可以捕获异常,添加有意义的信息,然后重新抛出一个不同的、更有意义的异常。这真的取决于你想做什么。
    请注意,返回无效值是一种不同的错误处理模式,在某些情况下是有意义的,但一般来说,您所描述的故障最好通过异常来处理。

    如果您能够保证该函数始终能够正确地处理异常,那么就在函数本身中处理异常,并在故障时返回
    None
    ,因为空列表可能是有效的返回,而
    None
    比整数返回码更像python

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

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

    永远不要测试您不知道如何处理的错误情况


    :),而
    None
    比整数返回码更像python

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

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

    永远不要测试您不知道如何处理的错误情况


    :)

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