2

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

有没有办法告诉脚本继续进行相当于将代码的每条语句都包装在 try: ... except: pass 子句中?日志当然会更好。

我注意到,当使用 Tkinter 等 GUI 工具包进行编程时,即使引发异常,应用程序也会继续运行。是否可以使用控制台完成此类事情?

4

7 回答 7

4

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

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

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

于 2015-11-22T22:08:28.017 回答
3

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

您似乎对编写“健壮”软件的含义感到困惑:健壮的程序不是难以杀死并且无论如何都会继续运行的程序,而是可以正确处理边缘情况的程序。保持跑步是不够的......保持跑步做明智的事情是关键。

不幸的是,没有办法自动做合理的事情,你必须根据具体情况考虑如何处理错误。

请注意,如果一个程序有很多,catch那么它很少是一个好的程序。例外是在很多地方提出的,但几乎无处可寻。

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

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

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

更好的是写:

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

这样只my_dict处理丢失键的情况,而不是KeyError异常会停止程序(当您不确定程序在做什么时停止程序是唯一合理的做法)。

于 2015-11-22T22:17:35.123 回答
2

Python 将“BaseException”作为异常类的基类。您可以捕获并忽略基类 Exception ,它将涵盖所有异常。

try
    ... your code here ...
except BaseException as exp:
    print "A General Exception Occurred"
于 2015-11-22T22:03:02.817 回答
1
try:
   # code segment
except:
   pass

pass关键字将忽略所有异常

于 2017-05-10T17:38:33.697 回答
0

您可以像@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模块。这会消除所有错误,包括语法错误。但是,永远不要在生产代码中使用它。

这应该可以完美地工作。它不会打印“foo”,但你会在print("bar")没有崩溃的情况下到达。

import fuckit

with fuckit:
    prnt("foo")

print("bar")
于 2015-11-22T22:20:43.070 回答
0

新世代的新答案...

Python 现在附带了 suppress(),这告诉解释器在运行时抑制指示的异常。

可以很容易地导入,如下所示

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

以上将起作用,不会引发将无效 int 字符串更改为 int 的 ValueError 异常...

它比第三方库更干净。

快乐黑客

于 2021-08-17T13:21:16.397 回答
0

通常,这个应该捕获所有内容:

try:
   ....
except:
   pass

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

于 2015-11-22T22:09:59.870 回答