如何忽略 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 异常...
它比第三方库更干净。
快乐黑客
我正在 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 异常...
它比第三方库更干净。
快乐黑客