我正在用Python编写自定义备份脚本。有时mkdir函数或打印函数或任何函数由于各种原因而失败。这样的异常会停止整个脚本并在中间停止备份,这非常令人沮丧。到目前为止,我通过添加try:... except:...语句并正确管理这些异常来管理这些问题。但是,有一天,其他一些声明或函数也可能引发异常,因为尚未触发的其他原因。
有没有办法告诉脚本无论如何?相当于在try中包装代码的每个语句:... except:pass子句?当然,日志会更好。
我注意到使用像Tkinter这样的GUI工具包编程时,即使引发异常,应用程序也会继续运行。是否可以使用控制台完成此类事情?
答案 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
传递关键字将忽略所有例外