作者:无名有名我无名_593 | 2023-08-30 12:53
我有一个尝试...除了我的代码中的块和抛出异常时.我真的只想继续使用代码,因为在这种情况下,一切都仍然可以正常运行.问题是如果你将except:block留空或者没有#do,它会给你一个语法错误.我不能继续使用,因为它不在循环中.是否有一个关键字,我可以使用它告诉代码继续前进?
1> Andy Hume..:
except:
pass
除了异常:传递#important不要吞下其他异常!
这将捕获SystemExit,KeyboardInterrupt以及您可能不想捕获的其他内容.
@ChthonicProject一个简单的`except`将捕获任何异常,包括一个KeyboardInterrupt,但只有它发生在`try`中.在你的例子里,一个KeyboardInterrupt可以在`try`之前或`except`里面出现,在那里它不会被捕获.如果你运行一个例如`while True:``try:pass``除了:pass`,你会发现KeyboardInterrupt只有大约50%的时间被捕获.如果你在`try`里面'time.sleep(1)`,你会发现它几乎每次都被捕获.
2> tzot..:
通用答案
Python中的标准"nop"是pass
声明:
try:
do_something()
except Exception:
pass
使用except Exception
而不是裸露的except
避免捕捉异常喜欢SystemExit
,KeyboardInterrupt
等等.
Python 2
由于在Python 2中记住了最后抛出的异常,异常抛出语句中涉及的一些对象将无限期地保持活动(实际上,直到下一个异常).如果这对您很重要并且(通常)您不需要记住最后抛出的异常,则可能需要执行以下操作而不是pass
:
try:
do_something()
except Exception:
sys.exc_clear()
这清除了最后抛出的异常.
Python 3
在Python 3中,保存异常实例的变量在退出块时被删除except
.即使变量先前保持一个值,在进入和退出该except
块之后它也会再次变为未定义.
这是一个比被接受的更好的答案,因为它使用"Exception:"而不仅仅是"except:",正如其他人所指出的那样,会不正确地吞下你不想捕获的其他东西,如SystemExit和KeyboardInterrupt.
请注意,在python 3中删除了"exc_clear".https://docs.python.org/3/whatsnew/3.0.html#index-22.有关在Python 3中解决此问题的一些方法,请参阅此处:https://cosmicpercolator.com/2016/01/13/exception-leaks-in-python-2-and-3/
+1它还清除了在运行unittests和期望异常时很重要的错误
3> Jack O'Conno..:
在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
如果你想模仿bare except
关键字,也忽略了 - KeyboardInterrupt
虽然你通常不会 - 你可以使用with suppress(BaseException)
.
编辑:在3.4版本之前看起来像是ignored
重命名的suppress
.
这相当于将代码包装在`try ... catch:pass`中,因此如果在块内引发异常,则在块结束后继续执行.
仅供参考,django在2017-09撤消了对with with exclude(Exception)`的使用,因为try / except的性能更好。检查此提交[已恢复“已修复#27818-将try / except / pass替换为contextlib.su…](https://github.com/django/django/commit/6e4c6281dbb7ee12bcdc22620894edb4e9cf623f)
我不确定我喜欢这个解决方案...我想这个想法是我们用1替换了3行(try,除了,并且pass都合并为一个.)我反对的主要是这个怎么样介绍一个新的关键字,似乎证明你可能不应该做的事情...似乎你应该总是至少记录你正在捕捉的异常...
@ArtOfWarfare如果我说的话,我会给你一个整数,但有时候我会用单个元组给你,当我做其中一个时我不会告诉你; 现在你的工作是总是给我回整数?也许你会希望能够编写类似`with suppress(TypeError)的东西:return data [0]`(更长的例子:http://pastebin.com/gcvAGqEP)
4> ryeguy..:
试试这个:
try:
blah()
except:
pass