Как правильно обработать случай, когда итерация для одного элемента вызывает ошибку? - PullRequest
0 голосов
/ 02 августа 2020

У меня есть код, который разлагает волну на составляющие частоты и строит эти составляющие. Вот метод построения графика:

    def plot_components(self):
        try:
            N = self.rate * self.time
            t_vec = np.arange(N) * self.period

            fig, axes = plt.subplots(len(self.components), 1)
            for i, wave in enumerate(self.components):
                axes[i].plot(t_vec, wave)
            plt.xlabel('Time')
            plt.ylabel('Amplitude')
            plt.show()
        except ValueError:
            print('plt_components: Encoder must be fit against composite wave before plotting')
            raise

Он отлично работает, если возвращаются несколько волновых компонентов. Иногда либо волна не имеет никаких компонентов, кроме самой себя, либо иногда алгоритм может идентифицировать только один компонент. В этом случае одноэлементная волна составляет список компонентов, и я получаю эту ошибку:

TypeError: 'AxesSubplot' object is not subscriptable

Я думал о том, чтобы обработать это с помощью другого оператора except:

except TypeError:
   axes.plot(t_vec, self.components[0])
   plt.show()

И это действительно работает. Однако я не уверен, что это правильное использование обработки ошибок? Я немного новичок в идее остановки / обработки ошибок и хочу знать, нормально ли то, что я сделал, на практике.

Думаю, моя нервозность возникает из-за того, что я задаюсь вопросом: «Что, если другой TypeError будет брошен для причина, по которой я не ожидал? "

1 Ответ

1 голос
/ 02 августа 2020

Вы можете добавить небольшую отметку после строки plt.subplots:

if len(self.components) == 1:
    axes = [axes]

В общем, существует руководство по кодированию EAFP , программирование для счастливого потока и перехват исключений - это допустимый стиль кодирования. Если вы беспокоитесь, вы можете заключить в блок try-except только некорректную строку.

...