From a2b7871c17bceb99a649769c247785c2a462e6fe Mon Sep 17 00:00:00 2001 From: Aleksey Khorev Date: Tue, 19 Mar 2019 07:31:45 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A7=D1=83=D1=82=D0=BA=D0=B0=20=D0=BA=D0=BE?= =?UTF-8?q?=D0=B4=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...20\260\321\200\321\201\320\265\321\200.os" | 56 +++++++++------- ...20\266\320\265\320\275\320\270\321\217.os" | 3 + ...20\266\320\265\320\275\320\270\320\265.os" | 65 ++++++++++++++++--- 3 files changed, 93 insertions(+), 31 deletions(-) diff --git "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/internal/parser/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\260\321\200\321\201\320\265\321\200.os" "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/internal/parser/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\260\321\200\321\201\320\265\321\200.os" index f1d583b..b264f21 100644 --- "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/internal/parser/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\260\321\200\321\201\320\265\321\200.os" +++ "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/internal/parser/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\260\321\200\321\201\320\265\321\200.os" @@ -10,7 +10,7 @@ Перем ТокеныПарсера; -Перем ТекущаяПозиция; +Перем Парсер_ТекущаяПозиция; Перем НайденныйТокен; Перем СкинутьОпции; @@ -32,7 +32,7 @@ Лог.Отладка("Спек %1", Спек); Лог.Отладка("Количество опций: %1", Опции.Количество()); - ТекущаяПозиция = 0; + Парсер_ТекущаяПозиция = 0; СкинутьОпции = Ложь; @@ -111,7 +111,8 @@ КонечноеСостояние = Неопределено; Если КонецТокенов() Тогда - ВызватьИсключение "Не правильная строка использования"; + + Ошибка("Не правильная строка использования", Парсер_ТекущаяПозиция, Истина); ИначеЕсли НашлиТокен(ТипыТокенов.TTArg) Тогда @@ -120,7 +121,7 @@ КлассОпции = АргументыИндекс[Имя]; Если КлассОпции = Неопределено Тогда Назад(); - ВызватьИсключение "Нашли не объявленный аргумент"; + Ошибка("Нашли не объявленный аргумент", Парсер_ТекущаяПозиция, Истина); КонецЕсли; КонечноеСостояние = НачальноеСостояние.Т(Новый АргументыПарсера(КлассОпции), ОбработчикВыборкиПути.НовоеСостояние()); @@ -129,8 +130,7 @@ Если СкинутьОпции Тогда Назад(); - Сообщить("нет опций после --"); - ВызватьИсключение "нет опций после --"; + Ошибка("Не нашли опций после --", Парсер_ТекущаяПозиция, Истина); КонецЕсли; КонечноеСостояние = ОбработчикВыборкиПути.НовоеСостояние(); НачальноеСостояние.Т(Новый ВсеОпцииПарсера(Опции, ОпцииИндекс), КонечноеСостояние); @@ -140,8 +140,7 @@ Лог.Отладка("Обрабатываю токен: %1", НайденныйТокен.Тип); Если СкинутьОпции Тогда Назад(); - Сообщить("нет опций после --"); - ВызватьИсключение "нет опций после --"; + Ошибка("Не нашли опций после --", Парсер_ТекущаяПозиция, Истина); КонецЕсли; Имя = НайденныйТокен.Значение; @@ -151,8 +150,7 @@ Если КлассОпции = Неопределено Тогда Назад(); - Сообщить("Нашли не объявленную опцию"); - ВызватьИсключение "Ошибка"; + Ошибка("Нашли не объявленную опцию", Парсер_ТекущаяПозиция, Истина); КонецЕсли; КонечноеСостояние = НачальноеСостояние.Т(Новый ОпцияПарсера(КлассОпции, ОпцииИндекс), @@ -165,8 +163,7 @@ Если СкинутьОпции Тогда Назад(); - Сообщить("нет опций после --"); - ВызватьИсключение "нет опций после --"; + Ошибка("Не нашли опций после --", Парсер_ТекущаяПозиция, Истина); КонецЕсли; КонечноеСостояние = ОбработчикВыборкиПути.НовоеСостояние(); @@ -185,8 +182,7 @@ Если КлассОпции = Неопределено Тогда Назад(); - Сообщить("Нашли не объявленную опцию"); - ВызватьИсключение "Ошибка Нашли не объявленную опцию"; + Ошибка("Нашли не объявленную опцию", Парсер_ТекущаяПозиция, Истина); КонецЕсли; МассивДоступныхОпций.Вставить(КлассОпции, КлассОпции); @@ -220,7 +216,7 @@ Возврат Новый Структура("НачальноеСостояние, КонечноеСостояние", НачальноеСостояние, КонечноеСостояние); Иначе - ВызватьИсключение "Все плохо сэр. Паника"; + Ошибка("Неизвестный токен", Парсер_ТекущаяПозиция, Истина); КонецЕсли; Если НашлиТокен(ТипыТокенов.TTRep) Тогда @@ -229,7 +225,7 @@ КонецЕсли; Если КонечноеСостояние = Неопределено Тогда - ВызватьИсключение "Не могу правильно построить маршрут"; + Ошибка("Не могу правильно выстроить строку использования", Парсер_ТекущаяПозиция, Истина); КонецЕсли; Возврат Новый Структура("НачальноеСостояние, КонечноеСостояние", НачальноеСостояние, КонечноеСостояние); @@ -265,20 +261,36 @@ Процедура ОжидаюТокен(ТипТокена) Если НЕ НашлиТокен(ТипТокена) Тогда - ВызватьИсключение "Не найден ожидаемый токен " + ТипТокена; + Ошибка("Не найден ожидаемый токен " + ТипТокена, Парсер_ТекущаяПозиция, Истина); КонецЕсли; КонецПроцедуры +Процедура Ошибка(Текст, Позиция = Неопределено, Остановить = Ложь) + Перем ТекстОшибки; + Если Позиция = Неопределено Тогда + Позиция = Парсер_ТекущаяПозиция;// Мин(Парсер_ТекущаяПозиция - СтрДлина(Парсер_Литерал), Парсер_Длина); + КонецЕсли; + ТекстОшибки = СтрШаблон("[ Кол: %2 ] %3", + Позиция, + Текст + ); + Если Остановить Тогда + ВызватьИсключение ТекстОшибки; + Иначе + Лог.КритичнаяОшибка(ТекстОшибки); + КонецЕсли; +КонецПроцедуры // Ошибка() + Функция КонецТокенов() - Возврат ТекущаяПозиция >= ТокеныПарсера.Количество(); + Возврат Парсер_ТекущаяПозиция >= ТокеныПарсера.Количество(); КонецФункции Процедура Назад() - ТекущаяПозиция = ТекущаяПозиция - 1; + Парсер_ТекущаяПозиция = Парсер_ТекущаяПозиция - 1; КонецПроцедуры @@ -288,7 +300,7 @@ Возврат Неопределено; КонецЕсли; - Возврат ТокеныПарсера[ТекущаяПозиция]; + Возврат ТокеныПарсера[Парсер_ТекущаяПозиция]; КонецФункции @@ -330,9 +342,9 @@ Лог.Отладка("Нашли токен: %1", ТипТокена); НайденныйТокен = Токен(); - ТекущаяПозиция = ТекущаяПозиция + 1; + Парсер_ТекущаяПозиция = Парсер_ТекущаяПозиция + 1; - ЛОг.Отладка("Текущая позиция: %1", ТекущаяПозиция); + ЛОг.Отладка("Текущая позиция: %1", Парсер_ТекущаяПозиция); Возврат Истина; diff --git "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\237\321\200\320\270\320\273\320\276\320\266\320\265\320\275\320\270\321\217.os" "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\237\321\200\320\270\320\273\320\276\320\266\320\265\320\275\320\270\321\217.os" index 20ee546..7480e46 100644 --- "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\237\321\200\320\270\320\273\320\276\320\266\320\265\320\275\320\270\321\217.os" +++ "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\237\321\200\320\270\320\273\320\276\320\266\320\265\320\275\320\270\321\217.os" @@ -1127,6 +1127,9 @@ КонецФункции +Процедура ПриОшибке(ТекстОшибки) + Приложение.ВыполнитьПриОшибке(ТекстОшибки, ЭтотОбъект); +КонецПроцедуры Процедура ВывестиПутьПарсераВОтладке() diff --git "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\275\321\201\320\276\320\273\321\214\320\275\320\276\320\265\320\237\321\200\320\270\320\273\320\276\320\266\320\265\320\275\320\270\320\265.os" "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\275\321\201\320\276\320\273\321\214\320\275\320\276\320\265\320\237\321\200\320\270\320\273\320\276\320\266\320\265\320\275\320\270\320\265.os" index 02a639b..cae62cd 100644 --- "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\275\321\201\320\276\320\273\321\214\320\275\320\276\320\265\320\237\321\200\320\270\320\273\320\276\320\266\320\265\320\275\320\270\320\265.os" +++ "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\275\321\201\320\276\320\273\321\214\320\275\320\276\320\265\320\237\321\200\320\270\320\273\320\276\320\266\320\265\320\275\320\270\320\265.os" @@ -1,3 +1,5 @@ +#Использовать delegate + // Класс ПараметрКоманды, для доступа к установленному значению из вне Перем ФлагВерсия Экспорт; // Строковое представление версии приложения @@ -6,6 +8,8 @@ Перем Команда; Перем НаименованиеПриложения; Перем ОписаниеПриложения; +Перем ОбработчикПриОшибке; +Перем ИмяМетодаОбработчикаПриОшибке; // Процедура добавляет версию приложения, // при вызове данной опции, показывается установленная версия и @@ -88,11 +92,11 @@ // // Параметры: // КлассРеализации - объект - класс, объект реализующий процедуру выполнения команды. -// ИмяПроцедуры - строка - имя процедуры, отличное от стандартного "ВыполнитьКоманду" +// ИмяМетода - строка - имя процедуры, отличное от стандартного "ВыполнитьКоманду" // -Процедура УстановитьОсновноеДействие(КлассРеализации, ИмяПроцедуры = "ВыполнитьКоманду") Экспорт +Процедура УстановитьОсновноеДействие(КлассРеализации, ИмяМетода = "ВыполнитьКоманду") Экспорт - Команда.УстановитьДействиеВыполнения(КлассРеализации, ИмяПроцедуры); + Команда.УстановитьДействиеВыполнения(КлассРеализации, ИмяМетода); КонецПроцедуры @@ -101,11 +105,11 @@ // // Параметры: // КлассРеализации - объект - класс, объект реализующий процедуру выполнения команды. -// ИмяПроцедуры - строка - имя процедуры, отличное от стандартного "ПередВыполнениемКоманды" +// ИмяМетода - строка - имя процедуры, отличное от стандартного "ПередВыполнениемКоманды" // -Процедура УстановитьДействиеПередВыполнением(КлассРеализации, ИмяПроцедуры = "ПередВыполнениемКоманды") Экспорт +Процедура УстановитьДействиеПередВыполнением(КлассРеализации, ИмяМетода = "ПередВыполнениемКоманды") Экспорт - Команда.УстановитьДействиеПередВыполнением(КлассРеализации, ИмяПроцедуры); + Команда.УстановитьДействиеПередВыполнением(КлассРеализации, ИмяМетода); КонецПроцедуры @@ -114,12 +118,26 @@ // // Параметры: // КлассРеализации - объект - класс, объект реализующий процедуру выполнения команды. -// ИмяПроцедуры - строка - имя процедуры, отличное от стандартного "ПослеВыполненияКоманды" +// ИмяМетода - строка - имя процедуры, отличное от стандартного "ПослеВыполненияКоманды" // -Процедура УстановитьДействиеПослеВыполнения(КлассРеализации, ИмяПроцедуры = "ПослеВыполненияКоманды") Экспорт +Процедура УстановитьДействиеПослеВыполнения(КлассРеализации, ИмяМетода = "ПослеВыполненияКоманды") Экспорт - Команда.УстановитьДействиеПослеВыполнения(КлассРеализации, ИмяПроцедуры); + Команда.УстановитьДействиеПослеВыполнения(КлассРеализации, ИмяМетода); + +КонецПроцедуры +// Процедура устанавливает процедуру "ПриОшибке" выполнения для приложения +// запускаемую в случае возникновения ошибки +// +// Параметры: +// КлассРеализации - объект - класс, объект реализующий процедуру выполнения команды. +// ИмяМетода - строка - имя процедуры, отличное от стандартного "ПриОшибке" +// +Процедура УстановитьДействиеПриОшибке(КлассРеализации, ИмяМетода = "ПриОшибке") Экспорт + + ОбработчикПриОшибке = КлассРеализации; + ИмяМетодаОбработчикаПриОшибке = ИмяМетода; + КонецПроцедуры // Функция добавляет опцию приложения и возвращает экземпляр данной опции @@ -171,6 +189,35 @@ КонецПроцедуры +// Предопределенная процедура обработки ошибки приложения, если не задана процедура в классе. +// Выводит справку, по работе с приложением и завершает работу с кодом "1" +// Переопределяется, процедурой "УстановитьДействиеПриОшибке" +// +// Параметры: +// ТекстОшибки - Строка - Текст с описанием ошибки +// КомандаПриложения - Объект - инстанс класса КомандаПриложения, для доступа к опция и аргументам выполняемой команды +// +Процедура ВыполнитьПриОшибке(Знач ТекстОшибки, Знач КомандаПриложения) Экспорт + + Если ЗначениеЗаполнено(ОбработчикПриОшибке) Тогда + + Параметры = Новый Массив(); + Параметры.Добавить(ТекстОшибки); + Параметры.Добавить(КомандаПриложения); + + ДелегатДействия = Делегаты.Создать(ОбработчикПриОшибке, ИмяМетодаОбработчикаПриОшибке); + ДелегатДействия.Исполнить(Параметры); + ЗавершитьРаботу(1); + + Иначе + + КомандаПриложения.ВывестиСправку(); + ЗавершитьРаботу(1); + + КонецЕсли; + +КонецПроцедуры + Процедура ВывестиВерсию() Сообщить(ВерсияПриложения);