除了Python之外,什么时候应该实际使用try?

除了Python之外,什么时候应该实际使用try?,python,python-3.x,error-handling,exception-handling,Python,Python 3.x,Error Handling,Exception Handling,我通常在需要用户输入数据或尝试启动线程时使用try-except块。但是有没有什么经验法则告诉我们什么时候应该使用try-except块呢?从技术上讲,没有什么能阻止你做以下“聪明”的事情: 例如,当我觉得可能出现以下错误时,是否应该实现try-except块 $ python -m pydoc builtins BaseException Exception ArithmeticError FloatingPointError

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

例如,当我觉得可能出现以下错误时,是否应该实现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

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


为了获得流畅的用户体验,捕获某些超出您控制范围的异常(如连接错误)也可能是一件好事,这样您就可以告诉用户发生了什么,他们可以尝试补救。

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


为了获得流畅的用户体验,捕获某些超出您控制范围的异常(如连接错误)也可能是一件好事,这样您就可以告诉用户发生了什么,他们可以尝试进行补救。

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

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

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

我在回答另一个问题时对此做了更详细的说明:

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


另外,如果您不知道代码可能引发什么异常,请查看文档。通常,相关的例外情况都会记录在案。在被调用代码的控制之外总是有可能发生一些异常,例如
MemoryError
,但这些异常通常既不是预期的,也不是真正可恢复的,因此,您不应该真正检查这些问题。

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

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

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

我在回答另一个问题时对此做了更详细的说明:

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


另外,如果您不知道代码可能引发什么异常,请查看文档。通常,相关的例外情况都会记录在案。某些异常可能总是发生在被调用代码的控制之外,例如
MemoryError
,但这些异常通常既不是预期的,也不是真正可恢复的,因此您不应该真正检查这些异常。

。。。当你想处理它们的时候。但请不要使用空白的
,除了
,请指定要捕获的错误。
$ 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