【问题标题】:When should one de facto use try-except in Python? [closed]什么时候应该在 Python 中使用 try-except? [关闭]
【发布时间】:2018-06-20 09:51:29
【问题描述】:

当我需要来自用户的输入数据或尝试启动线程时,我通常使用 try-except 块。但是是否有一些经验法则可以告诉我们什么时候绝对应该使用 try-except 块?从技术上讲,没有什么能阻止你做一些“聪明”的事情:

try:
    print("Hello world")
except:
    print("Bye bye world")

每当我觉得可能出现以下错误之一时,是否应该实施 try-except 块?

$ python -m pydoc builtins


BaseException
    Exception
        ArithmeticError
            FloatingPointError
            OverflowError
            ZeroDivisionError
        AssertionError
        AttributeError
        BufferError
        EOFError
        ImportError
            ModuleNotFoundError
        LookupError
            IndexError
            KeyError
        MemoryError
        NameError
            UnboundLocalError
        OSError
            BlockingIOError
            ChildProcessError
            ConnectionError
                BrokenPipeError
                ConnectionAbortedError
                ConnectionRefusedError
                ConnectionResetError
            FileExistsError
            FileNotFoundError
            InterruptedError
            IsADirectoryError
            NotADirectoryError
            PermissionError
            ProcessLookupError
            TimeoutError
        ReferenceError
        RuntimeError
            NotImplementedError
            RecursionError
        StopAsyncIteration
        StopIteration
        SyntaxError
            IndentationError
                TabError
        SystemError
        TypeError
        ValueError
            UnicodeError
                UnicodeDecodeError
                UnicodeEncodeError
                UnicodeTranslateError
        Warning
            BytesWarning
            DeprecationWarning
            FutureWarning
            ImportWarning
            PendingDeprecationWarning
            ResourceWarning
            RuntimeWarning
            SyntaxWarning
            UnicodeWarning
            UserWarning
    GeneratorExit
    KeyboardInterrupt
    SystemExit

【问题讨论】:

  • ... 以及何时处理它们。但请不要使用空白except,请指定您要捕获的错误。
  • 这是一个关于exception handling / 错误处理的非常笼统的问题,对于这种问答格式来说太宽泛了。您可能应该从阅读该主题开始。然后在实践中询问具体案例。

标签: python python-3.x error-handling exception-handling


【解决方案1】:

它真的应该只在您希望以某种方式处理的程序中可能发生错误时使用。您可能知道可能会发生错误,例如内存错误,但除非您希望程序以某种方式做出反应,否则不应使用 try-except 块。

为了获得流畅的用户体验,捕捉某些您无法控制的异常(如连接错误)也可能会很好,这样您就可以告诉用户发生了什么,他们可以尝试进行补救。

【讨论】:

    【解决方案2】:

    当被调用的代码遇到无法自行解决的问题时会引发异常。例如,当参数无效时,或者当它尝试访问的资源没有正确响应时。异常通常意味着异常,虽然它们可能在执行某事时发生,但正常控制流不会有异常。

    您应该捕获异常,只要调用的代码可能引发异常您可以从中恢复。这部分非常重要:当您无法解决该故障时,捕获异常是没有用的。 仅捕获您希望引发的异常。

    在我说过异常是异常的之后,这似乎违反直觉,所以期待它们似乎很奇怪。但关键是代码可能会引发 any 异常。例如,有许多不同的外部因素可能导致完美运行的代码突然引发通常不会发生的异常。所以你不只是捕获任何异常。相反,您明确地捕获那些您期望最终从代码中引发的异常,并且您可以在不影响整个程序的情况下处理这些异常。

    我在回答另一个问题时详细介绍了这一点:Why is “except: pass” a bad programming practice?

    因此,基本上,当您调用的代码可能引发该异常时,捕获一个特定异常并且您可以从中恢复。询问用户输入并想要解析这个?从解析器中捕获异常并要求用户进行更正。对某些 API 执行网络请求?捕获网络异常,然后重试。编写一个用于使用 API 的库,然后执行网络请求? 不要捕获网络异常,而是让您的代码的使用者决定如何从中恢复。

    另外,如果您不知道代码会引发哪些异常,请查看文档。通常会记录相关的例外情况。总有可能发生某些异常,超出被调用代码的控制范围,例如MemoryError,但这些通常既不可预料,也无法真正恢复,因此您不应该真正检查这些。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-09-11
      • 1970-01-01
      • 2012-12-23
      • 2021-07-13
      • 2011-11-01
      • 2011-01-29
      • 2013-12-27
      • 2022-01-02
      相关资源
      最近更新 更多