如何阻止错误被多个块以外的错误捕获?

时间:2019-07-10 07:32:48

标签: python exception

我在try块中有一些代码,引发ValueError。我有一个例外块,可以捕获此ValueError并进行处理。完成此操作后,除块外,我不希望其他块捕获此ValueError。

在下面的代码中,在代码的稍后部分还有另一种tryexcept块,该ValueError也被第二个捕获。我该如何确保ValueError仅被第一个除外捕获,而第二个除外?

# Get features to plot
try: #First Try Block
    raw_features_list_1 = fsobject_1.genFeature(gmm.FftClassifier.fft_features)
except ValueError: #First Except Block
    pass

filtered_features_list_1 = np.array([row[0] for row in raw_features_list_1 if row is not None]).reshape(-1, 1)

try: #Second Try Block
    raw_features_list_2 = fsobject_2.genFeature(gmm.FftClassifier.fft_features)
except ValueError: #Second Except Block
    pass
    print("I am here")

filtered_features_list_2 = np.array([row[0] for row in raw_features_list_2 if row is not None]).reshape(-1, 1)

上面的代码给了我以下结果:

I am here
NameError                                 Traceback (most recent call last)
<ipython-input-16-ff0067cb5362> in <module>
     11     pass
     12     print("I am here")
---> 13 filtered_features_list_2 = np.array([row[0] for row in raw_features_list_2 if row is not None]).reshape(-1, 1)

NameError: name 'raw_features_list_2' is not defined

这是因为由于第一个Try块生成的ValueError,因此未评估第二个try块,而直接评估了第二个Except块。

我想评估第一个Try块,在First Except块中处理ValueError。然后评估第二个Try块,如果它生成ValueError,则在第二个Except块中处理它。

1 个答案:

答案 0 :(得分:0)

抱歉,我要问的已经是python的默认行为。 我还有另一个问题,其中生成raw_features_list_2的函数在返回raw_features_list_2之前引发ValueError并中止。因此,我觉得第二个try块根本没有被评估。我通过处理返回raw_features_list_2的函数中的异常解决了我的问题。

从下面可以看出,python仅捕获一次异常。

globalVariable = 0

try
{
    x = FunctionThatRandomlyGivesError();
    return (x*globalVariable);
}
catch (Exception ex)
{
    throw;
}
finally
{
    globalVariable=1
    CleanUp();
}

所以我的问题是..无关紧要的。