Python: How to ignore an exception and proceed?
我试一试……除了代码中的块和抛出异常时。我只是想继续写代码,因为在这种情况下,一切都可以正常运行。问题是,如果保留except: block为空,或者使用#do nothing,就会出现语法错误。我不能使用continue,因为它不在循环中。是否有一个关键字可以用来告诉代码继续运行?
- 除了异常:传递# important不要吞下其他异常!
- @Aaron -我同意,但问题不是这是个好主意还是坏主意
- 这将捕获SystemExit、KeyboardInterrupt和其他您可能不想捕获的东西。
- 它不会捕获KeyboardInterrupt。例如:while True: try: f = open('filedoesnot exists .txt') ' except: pass KeyboardInterrupt停止并退出代码。
- @ChthonicProject一个裸露的except将捕获任何异常,包括一个KeyboardInterrupt,但只有当它发生在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除了传递block。
- 还可以在except子句中使用...(省略号)代替pass: except: ...
通用答案
Python中的标准"nop"是pass语句:
1 2 3 4
| try:
do_something()
except Exception:
pass |
使用except Exception而不是一个简单的except,避免捕获像SystemExit、KeyboardInterrupt等异常。
Python 2
由于上次抛出的异常在python2中被记住了,异常抛出语句中涉及的一些对象将无限期地保持活动状态(实际上,直到下一个异常)。如果这对您很重要,并且(通常)您不需要记住上次抛出的异常,您可能希望执行以下操作,而不是执行pass:
1 2 3 4
| try:
do_something()
except Exception:
sys.exc_clear() |
这将清除最后抛出的异常。
Python 3
在python3中,保存异常实例的变量在退出except块时被删除。即使该变量先前持有一个值,在进入和退出except块之后,它将再次变得未定义。
- 这是一个比被接受的答案更好的答案,因为它使用"except Exception:"而不是"except:",正如其他人指出的那样,"except:"将不正确地吞下您不想捕获的其他东西,比如SystemExit和KeyboardInterrupt。
- 它还清除了错误,这在运行单元测试和期望异常时非常重要
- 注意,在python3中删除了exc_clear。docs.python.org/3/whatsnew/3.0.html # index-22。要在python3中找到一些解决这个问题的方法,请点击这里:cosmicpercolator.com/2016/01/13/…
- 要快速忽略多个异常,请参见stackoverflow.com/a/53575187/3140992
- 还可以在except子句中使用...(省略号)代替pass: except Exception: ...
在Python 3.4中有一种新的方法可以做到这一点:
1 2 3 4
| from contextlib import suppress
with suppress(Exception):
# your code |
下面是添加它的commit: 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。
- 我不确定我是否喜欢这个解决方案…我想我们的想法是将3行替换为1行(try、except和pass都合并为1行)。我反对的主要事情是,这是如何引入一个新的关键字,似乎证明你可能不应该做的事情…似乎您应该始终至少记录您正在捕获的异常……
- 当异常被引发时,它会在try/catch或with块之外的任何地方继续执行代码吗?
- 这相当于将代码包装在try...catch: pass中,因此,如果在块中引发异常,则在块结束后继续执行。
- @JackO'Connor:好吧,那就没什么用了……我认为它会像承诺的那样忽略异常。
- @ artofwar如果我说,我会给你一个整数,但有时我会给你一个单元组,我不会告诉你我什么时候做一个或另一个;现在你的工作就是总是把整数还给我?也许您希望能够编写像with suppress(TypeError): return data[0]这样的代码(更长的示例:pastebin.com/gcvAGqEP)
- @Navin Python不能假装不存在异常。假设我有一个像y = f(x) * g(x)这样的语句,然后f(x)引发一个异常。即使Python忽略它,f(x)也不会返回值,因此Python没有办法为y赋值。设计人员可能会说"假定值为None"或"跳过包含任何未计算值的表达式的语句",但这将导致非常混乱。使用try块将失败的语句分组在一起可以使事情变得简单。
- @JackO’connor很好。我希望如果一个表达式引发异常,可以用None替换它。
- 它可以内联完成吗?比如supress(myFunc, suppressedException, returnValueOnFailure)?
- @JeromeJ不能直接使用suppress实现这一点,因为它是一个上下文管理器。(有关上下文管理器如何工作的详细信息,请参见这里:docs.python.org/3.4/library/stdtypes.html#typecontextmanager??)但是,如果需要的话,可以在内部定义使用suppress或普通的try块的自己的callCatchingExceptions函数。
- 顺便说一句,django在2017-09年恢复使用with suppress(Exception),因为try/except性能更好。检查这个提交是否恢复了"Fixed #27818——用context .su…
试试这个:
1 2 3 4
| try:
blah()
except:
pass |