Как остановить ошибку от перехвата более чем одним, кроме блоков? - PullRequest
0 голосов
/ 10 июля 2019

У меня есть некоторый код внутри блока try, который выдает ошибку ValueError. У меня есть блок кроме, который ловит этот ValueError и обрабатывает его. Как только это будет сделано, я не хочу, чтобы другие блоки блокировали этот ValueError, кроме блоков.

В приведенном ниже коде есть еще одна попытка, кроме блока в коде, и эта ошибка 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

Это связано с тем, что из-за ошибки ValueError, сгенерированной первым блоком Try, второй блок try не оценивается, а второй блок Except оценивается напрямую.

Я хотел бы оценить первые пробные блоки, обработать ошибку ValueError в первом блоке, кроме. Затем оцените второй Try Blocks и, если он генерирует ValueError, обработайте его во втором Except Block.

1 Ответ

0 голосов
/ 10 июля 2019

Извините, похоже, что то, что я спрашиваю, уже является поведением Python по умолчанию. У меня была другая проблема, когда функция, генерирующая raw_features_list_2, выдавала ValueError и прерывала работу перед возвратом raw_features_list_2. Таким образом, я чувствовал, что второй блок попытки вообще не оценивался. Я исправил свою проблему, обработав исключение внутри функции, которая возвращает raw_features_list_2.

Как видно ниже, python ловит исключение только один раз.

In [26]: try: 
    ...:     1/0 
    ...: except ZeroDivisionError: 
    ...:     print("Caught") 
    ...: try: 
    ...:     pass 
    ...: except ZeroDivisionError: 
    ...:     print("Caught Again")
Caught

Так что мой вопрос ... вроде не имеет значения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...