Python:如何忽略异常并继续? [复制]

Posted

技术标签:

【中文标题】Python:如何忽略异常并继续? [复制]【英文标题】:Python: How to ignore an exception and proceed? [duplicate] 【发布时间】:2010-10-09 03:38:51 【问题描述】:

我的代码中有一个 try...except 块,当抛出异常时。我真的只想继续编写代码,因为在这种情况下,一切仍然可以正常运行。问题是,如果您将 except: 块留空或使用 #do nothing,则会出现语法错误。我不能使用 continue 因为它不在循环中。我可以使用一个关键字来告诉代码继续运行吗?

【问题讨论】:

【参考方案1】:
except Exception:
    pass

Python docs for the pass statement

【讨论】:

except Exception: pass #important 不要吞下其他异常! 这将捕获 SystemExit、KeyboardInterrupt 和其他您可能不想捕获的东西。 它不会捕获键盘中断。例如:while True:try: f = open('filedoesnotexist.txt')`except:passKeyboardInterrupt 停止并退出代码。 @ChthonicProject 一个裸露的except 将捕获任何异常,包括键盘中断,但前提是它发生在try 内。在您的示例中,KeyboardInterrupt 可能发生在try 之前或except 内部,不会被捕获。如果您运行像while True: try: pass except: pass 这样的示例,您会发现KeyboardInterrupt 仅在大约50% 的时间内被捕获。如果你在try 里面time.sleep(1),你会发现它几乎每次都会被抓到。 这会在第一个异常后停止执行。我只想完全忽略所有异常,例如print('this'); 1/0; print('this too');?假设我有 10 个命令,不想写 10 个 try 除了 pass 块。【参考方案2】:

通用答案

Python 中的标准“nop”是pass 语句:

try:
    do_something()
except Exception:
    pass

使用except Exception 而不是纯except 避免捕获SystemExitKeyboardInterrupt 等异常。

Python 2

由于在 Python 2 中会记住最后抛出的异常,因此抛出异常语句中涉及的一些对象会无限期地保持活动状态(实际上,直到下一个异常)。如果这对您很重要并且(通常)您不需要记住最后抛出的异常,您可能需要执行以下操作而不是 pass

try:
    do_something()
except Exception:
    sys.exc_clear()

这会清除最后抛出的异常。

Python 3

在 Python 3 中,保存异常实例的变量会在退出 except 块时被删除。即使变量之前保存了一个值,在进入和退出except 块后,它又会变为undefined

【讨论】:

这是一个比被接受的更好的答案,因为它使用“except Exception:”而不是“except:”,正如其他人所指出的那样,它会不正确地吞下其他你不知道的东西想要像 SystemExit 和 KeyboardInterrupt 一样捕捉。 +1 它还清除了在运行单元测试和预期异常时很重要的错误 请注意,exc_clear 已在 python 3 中删除。docs.python.org/3/whatsnew/3.0.html#index-22。有关在 Python 3 中解决此问题的一些方法,请参见此处:cosmicpercolator.com/2016/01/13/… 见***.com/a/53575187/3140992 快速忽略多个异常 也可以在except 子句中使用...(省略号)代替passexcept Exception: ...【参考方案3】:

在 Python 3.4 中提供了一种新方法:

from contextlib import suppress

with suppress(Exception):
  # your code

这是添加它的提交:http://hg.python.org/cpython/rev/406b47c64480

这里是作者 Raymond Hettinger,谈论这个以及其他各种 Python 热点(相关位在 43:30):http://www.youtube.com/watch?v=OSGv2VnC0go

如果您想模拟简单的 except 关键字并忽略 KeyboardInterrupt 之类的内容(尽管您通常不这样做),您可以使用 with suppress(BaseException)

编辑:在 3.4 版本之前,ignored 似乎已重命名为 suppress

【讨论】:

我不确定我是否喜欢这个解决方案...我想我们的想法是我们已经用 1 行替换了 3 行(try、except 和 pass 都合并为一个。)我反对的主要事情是它如何引入一个新关键字,似乎证明了你可能不应该做的事情......看起来你应该总是至少记录你正在捕获的异常...... 当引发异常时,它会在 try/catch 或 with 块之外的任何内容之后继续执行代码吗? 这相当于将你的代码包装在try...catch: pass中,所以如果在块内引发异常,将在块结束后继续执行。 @ArtOfWarfare 如果我说,我会给你一个整数,但有时我会在一个单例元组中给你,我不会告诉你什么时候做一个或其他;现在你的工作是总是把整数还给我?也许你会喜欢写with suppress(TypeError): return data[0]之类的东西(更长的例子:pastebin.com/gcvAGqEP) 仅供参考,django 在 2017-09 恢复使用 with suppress(Exception),因为 try/except 表现更好。检查此提交Reverted "Fixed #27818 -- Replaced try/except/pass with contextlib.su…【参考方案4】:

试试这个:

try:
    blah()
except:
    pass

【讨论】:

以上是关于Python:如何忽略异常并继续? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

Python - 如何在 X 秒后终止进程并继续执行 python 代码? [复制]

Python - 如何在拆分字符串时忽略双引号中的空格? [复制]

这个 if 语句会抛出异常还是忽略它? [复制]

如何记录python异常? [复制]

警告:忽略无效的分发 -ip (c:\python39\lib\site-packages) 我该如何解决这个问题,这是啥意思? [复制]

如何在 Python 中实现用户定义的异常? [复制]