【发布时间】:2010-10-09 03:38:51
【问题描述】:
我的代码中有一个 try...except 块,当抛出异常时。我真的只想继续编写代码,因为在这种情况下,一切仍然可以正常运行。问题是,如果您将 except: 块留空或使用 #do nothing,则会出现语法错误。我不能使用 continue 因为它不在循环中。我可以使用一个关键字来告诉代码继续运行吗?
【问题讨论】:
我的代码中有一个 try...except 块,当抛出异常时。我真的只想继续编写代码,因为在这种情况下,一切仍然可以正常运行。问题是,如果您将 except: 块留空或使用 #do nothing,则会出现语法错误。我不能使用 continue 因为它不在循环中。我可以使用一个关键字来告诉代码继续运行吗?
【问题讨论】:
except Exception:
pass
【讨论】:
while True:try: f = open('filedoesnotexist.txt')`except:passKeyboardInterrupt 停止并退出代码。
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 块。
Python 中的标准“nop”是pass 语句:
try:
do_something()
except Exception:
pass
使用except Exception 而不是纯except 避免捕获SystemExit、KeyboardInterrupt 等异常。
由于在 Python 2 中会记住最后抛出的异常,因此抛出异常语句中涉及的一些对象会无限期地保持活动状态(实际上,直到下一个异常)。如果这对您很重要并且(通常)您不需要记住最后抛出的异常,您可能需要执行以下操作而不是 pass:
try:
do_something()
except Exception:
sys.exc_clear()
这会清除最后抛出的异常。
在 Python 3 中,保存异常实例的变量会在退出 except 块时被删除。即使变量之前保存了一个值,在进入和退出except 块后,它又会变为undefined。
【讨论】:
exc_clear 已在 python 3 中删除。docs.python.org/3/whatsnew/3.0.html#index-22。有关在 Python 3 中解决此问题的一些方法,请参见此处:cosmicpercolator.com/2016/01/13/…
except 子句中使用...(省略号)代替pass:except Exception: ...
在 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。
【讨论】:
with 块之外的任何内容之后继续执行代码吗?
try...catch: pass中,所以如果在块内引发异常,将在块结束后继续执行。
with suppress(TypeError): return data[0]之类的东西(更长的例子:pastebin.com/gcvAGqEP)
with suppress(Exception),因为 try/except 表现更好。检查此提交Reverted "Fixed #27818 -- Replaced try/except/pass with contextlib.su…
试试这个:
try:
blah()
except:
pass
【讨论】: