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

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

【问题讨论】:

    标签: python exception


    【解决方案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/…
    • stackoverflow.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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多