在PyCharm中避免“过于宽泛的例外条款”警告

2024-04-19 06:08:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在脚本的顶层编写一个异常子句,我只希望它记录发生的任何错误。令人恼火的是,如果我抓到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)

这个处理程序有问题吗?如果没有,我怎么能让皮查姆闭嘴呢?


Tags: import脚本logging错误记录exceptionpycharmraise
3条回答

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中有一个新特性:^{}

import contextlib

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

相当于:

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

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

在本例中,您很清楚什么是例外。最好是具体点。例如:

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

will yield "Oops was handled".

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

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

I suggest you to mark this inspection as 'okay' if the except block makes use of exception instance e somehow.

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

import logging

logging.basicConfig()

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

相关问题 更多 >