Если вы не перехватываете исключение, оно всплывает в стеке вызовов до тех пор, пока кто-нибудь не перехватит его. Если его никто не поймает, среда выполнения получит его и умрет с сообщением об ошибке исключения и полной трассировкой. IOW, вам не нужно явно перехватывать и повторно вызывать ваше исключение везде, что на самом деле лишило бы смысла иметь исключения. На самом деле, несмотря на то, что в основном используются для ошибок/непредвиденных ситуаций, исключения являются в первую очередь инструментом потока управления, позволяющим вырваться из нормального потока выполнения и передать управление (и некоторую информацию) в любое произвольное место в стеке вызовов.
Из этого POV ваш код кажется наиболее правильным (предупреждение: я не удосужился прочитать все это, просто быстро просмотрел), за исключением (без каламбура) для пары моментов:
Во-первых, вы должны определить свой собственный конкретный класс(ы) исключений вместо использования встроенного ValueError (вы можете наследовать от него, если это имеет смысл для вас), чтобы вы были уверены, что ловите только те исключения, которые ожидаете (довольно несколько уровней "под" ваш собственный код может вызвать неожиданную ошибку ValueError).
Затем вы можете (или нет, в зависимости от того, как используется ваш код) также захотеть добавить всеобъемлющий обработчик верхнего уровня в вашу функцию main()
, чтобы вы могли правильно регистрировать (используя модуль logger
) все ошибки и, в конечном итоге, освобождать ресурсы, сделайте некоторую очистку и т. д., прежде чем ваш процесс умрет.
В качестве побочного примечания вы также можете изучить и использовать правильное форматирование строк, и, по крайней мере, если производительность является проблемой, избегайте повторяющихся вызовов констант, таких как этот:
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, ни компилятор, ни среда выполнения не могут безопасно оптимизировать эти повторяющиеся вызовы (метод мог быть динамически переопределен между вызовами), поэтому вам придется делать это самостоятельно.
РЕДАКТИРОВАТЬ:
При попытке поймать ошибку в функции 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 env, каким-то образом неправильно обрабатывает основной файл плагина. Похоже, мне придется проверить ребят из MySQL Workbench.
Угу... Даже встроенное ожидание механизма должно работать должным образом - по крайней мере, для той части стека вызовов, которая зависит от вашей функции main
(не могу сказать, что происходит выше в стеке вызовов). Но, учитывая, как MySQL обрабатывает ошибки (а как насчет того, чтобы ваши данные усекались без вывода сообщений?), я не был бы особенно удивлен, если бы они взломали среду выполнения, чтобы молча передать любую ошибку в коде плагинов xD
person
bruno desthuilliers
schedule
27.02.2019
Python:
в заголовке. Достаточно пометить его с помощью Python. Не знаю, почему никто не сказал вам этого раньше. Я вижу, вы сделали это, по крайней мере, в каждом другом заданном вами вопросе. Вот почему я упоминаю об этом. - person Torxed   schedule 27.02.2019Generator
— это встроенный тип (функция) в Python. Повторное использование имени может запутать сопровождающих. - person MisterMiyagi   schedule 27.02.2019JpaAnnotatedClassGenerator
. См. редактирование. - person Kawu   schedule 27.02.2019