我怎么能写一个'try'/'除了'块捕获所有异常?

如何编写捕获所有异常的try/except块?

1002050 次浏览
try:whatever()except:# this will catch any exception or error

值得一提的是,这不是正确的Python编码。这也会捕获许多您可能不想捕获的错误。

你可以,但你可能不应该:

try:do_something()except:print("Caught it!")

但是,这也会捕获像KeyboardInterrupt这样的异常,而你通常不希望这样,是吗?除非你立即重新引发异常-请参阅以下示例从文档

try:f = open('myfile.txt')s = f.readline()i = int(s.strip())except IOError as (errno, strerror):print("I/O error({0}): {1}".format(errno, strerror))except ValueError:print("Could not convert data to an integer.")except:print("Unexpected error:", sys.exc_info()[0])raise

除了一个裸露的except:子句(正如其他人所说你不应该使用),你可以简单地捕获Exception

import tracebackimport logging
try:whatever()except Exception as e:logging.error(traceback.format_exc())# Logs the error appropriately.

例如,如果您想在终止之前处理任何未捕获的异常,您通常只会考虑在代码的最外层执行此操作。

except Exception相对于裸except的优势在于,它不会捕获一些例外,最明显的是KeyboardInterruptSystemExit:如果您捕获并吞下这些,那么您可能会使任何人难以退出您的脚本。

非常简单的例子,类似于这里的例子:

http://docs.python.org/tutorial/errors.html#defining-clean-up-actions

如果您试图捕获所有异常,请将所有代码放在“try:”语句中,而不是“print”执行可能引发异常的操作。

try:print "Performing an action which may throw an exception."except Exception, error:print "An exception was thrown!"print str(error)else:print "Everything looks great!"finally:print "Finally is called directly after executing the try statement whether an exception is thrown or not."

在上面的示例中,您将看到以下顺序的输出:

1)执行可能引发异常的操作。

2)无论是否抛出异常,最终都在执行try语句后直接调用。

3)“抛出异常!”或“一切看起来都很棒!”取决于是否抛出异常。

希望这有帮助!

您可以这样做来处理一般异常

try:a = 2/0except Exception as e:print e.__doc__print e.message

要捕获所有可能的异常,请捕获BaseException。它位于异常层次结构的顶部:

Python 3:https://docs.python.org/3.10/library/exceptions.html#exception-hierarchy

Python 2.7:https://docs.python.org/2.7/library/exceptions.html#exception-hierarchy

try:something()except BaseException as error:print('An exception occurred: {}'.format(error))

但正如其他人提到的,你通常不需要这个,只有在非常具体的情况下。

我刚刚发现了在Python 2.7中测试异常名称的小技巧。有时我在代码中处理了特定的异常,所以我需要一个测试来查看该名称是否在已处理的异常列表中。

try:raise IndexError #as test errorexcept Exception as e:excepName = type(e).__name__ # returns the name of the exception

有多种方法可以做到这一点,特别是在Python 3.0及更高版本中

办法1

这是一种简单的方法,但不推荐使用,因为您不知道究竟是哪行代码实际抛出了异常:

def bad_method():try:sqrt = 0**-1except Exception as e:print(e)
bad_method()

办法2

推荐这种方法是因为它提供了有关每个异常的更多详细信息。它包括:

  • 代码的行号
  • 文件名
  • 更详细的实际错误

唯一的缺点是回溯需要导入。

import traceback
def bad_method():try:sqrt = 0**-1except Exception:print(traceback.print_exc())
bad_method()

我添加了奖励方法,可以通过完整的追溯来捕获异常,这可以帮助您更多地了解错误。

Python 3

import traceback
try:# your code goes hereexcept Exception as e:print(e)traceback.print_exc()

首先,有些异常你希望它们破坏你的代码(因为当这个错误发生时,你的代码无论如何都不会运行!)和你希望静默/平稳地捕获的异常。试着区分它们。你可能不想捕获所有的异常!

其次,你可以花时间查看流程的日志,而不是捕获所有内容。假设你得到了一个不同的/第三方异常,例如来自像GCP这样的云服务提供商。在日志中,你可以找到你得到的异常。然后,你可以这样做:

from google.api_core.exceptions import ServiceUnavailable, RetryError
for i in range(10):try:print("do something")
except ValueError:print("I know this might happen for now at times! skipping this and continuing with my loop"
except ServiceUnavailable:print("our connection to a service (e.g. logging) of gcp has failed")print("initializing the cloud logger again and try continuing ...")
except RetryError:print("gcp connection retry failed. breaking the loop. try again later!)break

对于其余的(可能发生也可能不会发生的错误),如果我得到意外的异常,我将为我的代码留下崩溃的空间!这样我就可以了解发生了什么,并通过捕获边缘情况来改进我的代码。

如果您希望它永远不会因为某种原因而崩溃,例如,如果它是嵌入在您无法轻松访问的远程硬件中的代码,您可以在末尾添加一个通用异常捕获器:

except Exception as e:print(f"something went wrong! - {e}")

您还可以查看Python 3异常层次结构这里ExceptionBaseException的区别在于,Exception不会捕获SystemExitKeyboardInterruptGeneratorExit