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

时间:2015-11-22 21:54:20

标签: python python-3.x exception resiliency

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

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

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

6 个答案:

答案 0 :(得分:3)

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

虽然这显然是一个笑话。我无法想象这样做的事情是个好主意。上帝,我无法相信我甚至建议将其作为一种解决方案。

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

答案 1 :(得分:2)

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

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

答案 2 :(得分:2)

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

您似乎对于撰写"强健"意味着什么感到困惑。软件:一个强大的程序不是一个难以杀死的程序,无论如何都会继续运行,而是一个能够正确处理边缘情况的程序。保持跑步是不够的......保持跑步做出明智的事情是关键点。

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

请注意,如果一个程序有很多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例外将停止该程序(当您不确定它是什么时停止该程序&#39 ;做的是唯一合理的事情)。

答案 3 :(得分:0)

通常,这个应该抓住一切:

try:
   ....
except:
   pass

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

答案 4 :(得分:0)

您可以添加像@Kanwar Saad提议的常规除外块。问题是,在异常提出后,你能继续将你的程序保持在有效状态吗?

来自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")

答案 5 :(得分:0)

try:
   # code segment
except:
   pass

传递关键字将忽略所有例外