我正在脚本的顶层编写一个异常子句,我只想让它记录发生的任何错误。令人讨厌的是,如果我抓住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闭嘴呢?
答案 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 首选项 -> 检查 -> 停用不明确的例外条款