Если вы не поймаете исключение, оно будет пузыриться в стеке вызовов, пока кто-нибудь не поймет.Если никто не ловит его, среда выполнения получит его и умрет с сообщением об ошибке исключения и полным обратным отслеживанием.Итак, вам не нужно явно ловить и пересматривать ваше исключение везде, что фактически лишило бы смысла иметь исключения.На самом деле, несмотря на то, что он в основном используется для ошибок / непредвиденных ситуаций, исключения являются, прежде всего, инструментом потока управления, позволяющим выйти из нормального потока выполнения и передать управление (и некоторую информацию) в любое произвольное место в стеке вызовов.
Из этого POV ваш код кажется наиболее правильным (предостережение: я не удосужился прочитать все это, просто быстро посмотрел), за исключением (без отступов) для пары очков:
ПервыйВы должны определить свой собственный особый класс (ы) исключений вместо использования встроенного ValueError (вы можете наследовать от него, если это имеет смысл для вас), так что вы уверены, что поймаете только те исключения, которые ожидаете (довольно много слоев)в разделе «ваш собственный код может вызвать ошибку ValueError, которую вы не ожидали).
Затем вы можете (или нет, в зависимости от того, как используется ваш код) также захотеть добавить универсальный верхний уровеньобработчик в вашей функции main()
, чтобы вы могли правильно регистрировать (используя модуль logger
) все ошибки и, в конечном итоге, свободные ресурсы, делатьнекоторая очистка и т. д. до того, как ваш процесс умрет.
В качестве примечания, вы также можете изучить и использовать правильное форматирование строки, и - если, по крайней мере, проблема с perfs - избегать повторяющихся постоянных вызовов, подобных этой:
elif AnnotationUtil.is_embeddable_table(table) and AnnotationUtil.is_secondary_table(table):
# ...
elif AnnotationUtil.is_embeddable_table(table):
# ...
elif AnnotationUtil.is_secondary_table(table):
# ...
Учитывая очень динамичную природу Python, ни компилятор, ни среда выполнения не могут безопасно оптимизировать эти повторные вызовы (метод мог быть динамически переопределен между вызовами), поэтому вы должны сделать это самостоятельно.
EDIT:
При попытке уловить ошибку в функции main () исключения НЕ всплывают, но когда я использую этот шаблон на один уровень глубже, кажется, что всплывает всплывающее окно.
Вы можете легко убедиться, что он работает правильно, с помощью простого MCVE:
def deeply_nested():
raise ValueError("foo")
def nested():
return deeply_nested()
def firstline():
return nested()
def main():
try:
firstline()
except ValueError as e:
print("got {}".format(e))
else:
print("you will not see me")
if __name__ == "__main__":
main()
Похоже, что программное обеспечение, поставляющее среду Python, как-то обрабатывает основной файл плагинанеправильно.Похоже, мне придется проверить ребята из MySQL Workbench
Ух ... Даже встроенный механизм ожидания должен работать, как и ожидалось - по крайней мере, для той части стека вызовов, которая зависит от вашего main
функция (не может сказать, что происходит выше в стеке вызовов).Но учитывая то, как MySQL обрабатывает ошибки (как насчет того, чтобы ваши данные молча усекались?), Я не был бы особенно удивлен, если бы они взломали среду выполнения, чтобы молча передать любую ошибку в коде плагинов xD