如何忽略 Python 中的所有潜在异常?

How to ignore all potential exceptions in Python?

我正在 Python 中编写自定义备份脚本。有时 mkdir 函数或打印函数或任何函数由于各种原因而失败。这样的异常会停止整个脚本并在中间停止备份,这非常令人沮丧。到目前为止,我已经通过添加 try: ... except: ... 语句并正确管理这些异常来解决这些问题。但是,有一天某些其他语句或函数也可能会引发异常,因为尚未触发的某些其他原因。

有没有办法让脚本继续无论如何?相当于将代码的每个语句包装在 try: ... except: pass 子句中?有日志当然更好

我注意到,当使用 Tkinter 等 GUI 工具包进行编程时,即使出现异常,应用程序也会保持 运行。有没有可能用控制台完成这种事情?

Python 将 'BaseException' 作为异常 class 的基础 class。您可以捕获并忽略基础 class 异常,这将涵盖所有异常。

try
    ... your code here ...
except BaseException as exp:
    print "A General Exception Occurred"

实际上有一个模块可以做到这一点:https://github.com/ajalt/fuckitpy

虽然明明是开玩笑写的。我无法想象做这样的事情是个好主意的情况。天哪,我不敢相信我什至建议将其作为解决方案。

您应该做的是识别哪些代码行会产生什么样的错误,并正确处理这些错误。实际上可能发生错误的地方只有这么多——主要是在与外部系统交互时,包括文件系统、网络、用户输入等。请记住,实际失败通常比继续 "work" 和弄乱你的数据、文件要好等等。例外是有原因的,它们不是 Guido 恶意的结果。

通常情况下,这个应该能捕获所有内容:

try:
   ....
except:
   pass

唯一的问题是,您无法使用此语法获得异常对象,但在这种情况下并没有要求。

Python 无法做到这一点,并且有充分的理由。

您似乎对编写 "robust" 软件意味着什么感到困惑:健壮的程序不是 难以杀死 的程序保留 运行 无论如何,而是一个能够正确处理边缘情况的程序。保持 运行 是不够的...保持 运行 做明智的事情 是关键。

遗憾的是,无法自动执行合理的操作,您必须根据具体情况考虑如何处理错误。

请注意,如果一个程序有很多 catch,那么它很少是一个好程序。异常本应在很多地方出现,但几乎无处可寻。

另请注意,每个 catch 都可能是错误的来源...例如:

try:
    print my_dict[foo()]
except KeyError:
    ...

无法区分 KeyError 是为了访问 my_dict 中不存在的密钥还是从 foo() 中转义。很少有两种情况应该以相同的方式处理...

最好写成:

key = foo()
if key in my_dict:
    print my_dict[key]
else:
    ...

以便仅处理 my_dict 中缺少键的情况,而不是 KeyError 异常将停止程序(当您不确定程序在做什么时停止程序是唯一合理的做法)。

您可以像 @Kanwar Saad 提议的那样添加一个通用的 except 块。问题是,在引发异常后,您能否在有效状态下继续您的程序?

来自Python的禅宗:

Errors should never pass silently.
Unless explicitly silenced.

在我看来,尝试捕获您知道的所有异常是最好的方法。如果您不能显式捕获异常,则不应尝试解决它。您(和您的用户)应该知道到底出了什么问题,否则您的代码可能会成为调试的噩梦。

如果您担心丢失备份数据,也许您可​​以这样做:

def save_unfinished_backup():
    # try to find a graceful exit without losing any data

try:
    # some code
except OSError:
    # handle oS Errors
except Exception:
    save_unfinished_backup()
    raise

这样您就可以同时获得:避免数据丢失的机会和调试它的确切错误。

希望对您有所帮助!


有趣的是:您也可以使用 fuckit 模块。这会消除 ALL 错误,包括语法错误。不过,永远不要在生产代码中使用它。

这应该可以完美运行。它不会打印 "foo",但您将到达 print("bar") 而不会崩溃。

import fuckit

with fuckit:
    prnt("foo")

print("bar")
try:
   # code segment
except:
   pass

pass关键字将忽略所有异常

新一代的新答案...

Python 现在附带 suppress(),这告诉解释器在 运行.

时抑制指示的异常

可以轻松导入使用如下

from contextlib import suppress
with suppress(ValueError):
    int('this wont catch')
print('yea')

以上方法有效,不会引发将无效 int 字符串更改为 int 的 ValueError 异常...

它比第三方库更干净。

快乐黑客