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

时间:2016-11-23 23:16:58

标签: python exception-handling pycharm

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

import logging

logging.basicConfig()

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

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

5 个答案:

答案 0 :(得分:26)

来自Joran的评论:您可以使用# noinspection PyBroadException告诉PyCharm您可以使用此例外条款。这是我最初想要的,但我在建议菜单中错过了suppress the inspection的选项。

import logging

logging.basicConfig()

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

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

import contextlib

with contextlib.suppress(Exception):
    raise RuntimeError('Bad stuff happened.')

这相当于:

try:
    raise RuntimeError('Bad stuff happened.')
except Exception:
    pass

答案 1 :(得分:1)

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

在出现的情况下,您很清楚例外是什么。最好只是具体一点。例如:

try:
    raise RuntimeError("Oops")
except RuntimeError as e:
    print(e, "was handled")
     

将产生“糟糕的情况”。

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

答案 2 :(得分:0)

我在PyCharm的这个已关闭的feature request中找到了一个提示:

  

如果except块以某种方式使用异常实例e,我建议你将此检查标记为'okay'。

因为我正在使用exc_info=True进行日志记录,所以我隐式使用当前的异常对象,但是PyCharm并不知道。为了使它明确,我可以做一些有点hacky:exc_info可以使用任何truthy值在日志中包含堆栈跟踪。异常对象应该是真实的,因为它不是None

import logging

logging.basicConfig()

try:
    raise RuntimeError('Bad stuff happened.')
except Exception as e:
    logging.error('Failed.', exc_info=e)

答案 3 :(得分:0)

不确定您的PyCharm版本(我的版本是2019.2),但我强烈建议在“文件”>“设置”>“编辑器”>“检查”中禁用此PyCharm检查,然后键入“太宽泛”。在“ Python”选项卡中,取消选择“太宽泛的例外条款”以避免这些。我相信PyCharm这样可以为您显示正确的表情检查

答案 4 :(得分:0)

可以通过更改 pycharm 检查设置来删除异常提示消息。

pycharm 首选项 -> 检查 -> 停用不明确的例外条款