除了Python之外,什么时候应该实际使用try?
我通常在需要用户输入数据或尝试启动线程时使用try-except块。但是有没有什么经验法则告诉我们什么时候应该使用try-except块呢?从技术上讲,没有什么能阻止你做以下“聪明”的事情: 例如,当我觉得可能出现以下错误时,是否应该实现try-except块除了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
$ 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