Показать сообщение отдельно
Старый 21.01.2013, 15:46   #1
ViNT
Модератор
 
Регистрация: 03.04.2007
Сообщений: 2,252
Написано 597 полезных сообщений
(для 817 пользователей)
Обработка ошибок в MP2.0.2

Всем известно, что в случае runtime-ошибки в коде (например, неверное имя файла) MP наглухо зависает, не указывая, какая ошибка произошла.
Похоже, я нашел костыльное, но рабочее решение.

Вероятно, в новых версиях данную багу (или фичу?) уже пофиксили, но...
Лично мне больше нравится 2.0.2.
Так что, данная заметка для тех, кто все еще пользуется старой версией.

Разработчики поступили следующим образом:
Каждая процедура или функция (в том числе код главного модуля) выдает exception, который перебрасывается далее, в метод M.run(). Этот метод не перебрасывает исключение далее, а обрабатывает его. Точнее, он его "ловит", но никак не обрабатывает.

Идея состоит в том, чтобы заменить код обработки исключения на свой, и в случае какой-либо ошибки выводить сообщение с информацией об ошибке. Проблема в том, что основной код находится в том же классе, что и метод run(). Поэтому, я придумал следующий костыль.

Добавляем в проект модуль mainunit, в нем процедуру main (примерно, как в Си). Теперь весь код, который мы писали бы в файле проекта, будем писать в этом модуле. процедура main будет заменять главный блок begin...end. В главном модуле не пишем ничего. Теперь можно спокойно заменить класс M.class на "пропатченный" (например, с помощью MPExt).

Описание немного сумбурное, но пока непонятно, будет ли это кому-то интересно. Если будет интересно, буду ковырять дальше (в планах разработка мастера создания проектов под такую концепцию и раскуривание других возможных профитов от патча M.class).

На данный момент сообщения об ошибках выводятся через стандартный Alert. Прилагаю тестовый файл M.class и проект.

Главный вопрос: это кому-нибудь интересно (или все уже перешли на новые версии)?
Вложения
Тип файла: zip exc_jndl_test1.zip (5.6 Кб, 873 просмотров)
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
nil0q (23.01.2013)