在PyCharm中避免"太宽泛的异常条款"警告

Don*_*kby 23 python exception-handling pycharm

我正在脚本的顶层编写一个异常子句,我只想让它记录发生的任何错误.令人讨厌的是,PyCharm抱怨我是否抓住了Exception.

import logging

logging.basicConfig()

try:
    raise RuntimeError('Bad stuff happened.')
except Exception:  # <= causes warning: Too broad exception clause
    logging.error('Failed.', exc_info=True)
Run Code Online (Sandbox Code Playgroud)

这个处理程序有问题吗?如果没有,我怎么能告诉PyCharm闭嘴呢?

Don*_*kby 30

根据Joran的评论:你可以# noinspection PyBroadException用来告诉PyCharm你对这个例外条款没问题.这是我最初想要的,但我错过了在建议菜单中禁止检查的选项.

import logging

logging.basicConfig()

# noinspection PyBroadException
try:
    raise RuntimeError('Bad stuff happened.')
except Exception:
    logging.error('Failed.', exc_info=True)
Run Code Online (Sandbox Code Playgroud)

如果您甚至不想记录异常,并且只想在没有PyCharm抱怨的情况下禁止它,那么Python 3.4中就有一个新功能:contextlib.suppress().

import contextlib

with contextlib.suppress(Exception):
    raise RuntimeError('Bad stuff happened.')
Run Code Online (Sandbox Code Playgroud)

这相当于:

try:
    raise RuntimeError('Bad stuff happened.')
except Exception:
    pass
Run Code Online (Sandbox Code Playgroud)


Dea*_*anM 5

原则上我不愿意关闭警告。

在所呈现的案例中,您很清楚异常是什么。最好是具体的。例如:

try:
    raise RuntimeError("Oops")
except RuntimeError as e:
    print(e, "was handled")
Run Code Online (Sandbox Code Playgroud)

将产生“哎呀已处理”。

如果有几个可能的例外,您可以使用两个 except 子句。如果可能存在多种可能的异常,是否应该尝试使用单个 try 块来处理所有内容?重新考虑设计可能会更好!

  • 不过,在某些情况下,您事先并不知道错误,但仍想捕获它们。例如在[socket库](https://docs.python.org/3.7/library/socket.html#notes-on-socket-timeouts)中:“在非阻塞模式下,操作失败(错误为不幸的是,如果它们不能立即完成,则取决于系统” (2认同)