当前位置:  开发笔记 > 编程语言 > 正文

Python:如何忽略异常并继续?

如何解决《Python:如何忽略异常并继续?》经验,为你挑选了4个好方法。

我有一个尝试...除了我的代码中的块和抛出异常时.我真的只想继续使用代码,因为在这种情况下,一切都仍然可以正常运行.问题是如果你将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

推荐阅读
无名有名我无名_593
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有