Всем известно, что в случае runtime-ошибки в коде (например, неверное имя файла) MP наглухо зависает, не указывая, какая ошибка произошла.
Похоже, я нашел костыльное, но рабочее решение.
Вероятно, в новых версиях данную багу (или фичу?) уже пофиксили, но...
Лично мне больше нравится 2.0.2.
Так что, данная заметка для тех, кто все еще пользуется старой версией.
Разработчики поступили следующим образом:
Каждая процедура или функция (в том числе код главного модуля) выдает exception, который перебрасывается далее, в метод M.run(). Этот метод не перебрасывает исключение далее, а обрабатывает его. Точнее, он его "ловит", но никак не обрабатывает.
Идея состоит в том, чтобы заменить код обработки исключения на свой, и в случае какой-либо ошибки выводить сообщение с информацией об ошибке. Проблема в том, что основной код находится в том же классе, что и метод run(). Поэтому, я придумал следующий костыль.
Добавляем в проект модуль
mainunit, в нем процедуру
main (примерно, как в Си). Теперь весь код, который мы писали бы в файле проекта, будем писать в этом модуле. процедура
main будет заменять главный блок
begin...end. В главном модуле не пишем
ничего. Теперь можно спокойно заменить класс M.class на "пропатченный" (например, с помощью
MPExt).
Описание немного сумбурное, но пока непонятно, будет ли это кому-то интересно. Если будет интересно, буду ковырять дальше (в планах разработка мастера создания проектов под такую концепцию и раскуривание других возможных профитов от патча M.class).
На данный момент сообщения об ошибках выводятся через стандартный Alert. Прилагаю тестовый файл M.class и проект.
Главный вопрос: это кому-нибудь интересно (или все уже перешли на новые версии)?