From 642cd5cd874afa6457f47e1813d355447c3d1bfc Mon Sep 17 00:00:00 2001 From: Artur Ayukhanov Date: Tue, 19 Mar 2024 20:24:19 +0300 Subject: [PATCH 1/6] =?UTF-8?q?=D0=9F=D0=BE=D0=BA=D0=B0=D0=B7=20=D1=81?= =?UTF-8?q?=D1=82=D0=B5=D0=BA=D0=B0=20=D0=B2=D1=8B=D0=B7=D0=BE=D0=B2=D0=BE?= =?UTF-8?q?=D0=B2=20=D0=BF=D1=80=D0=B8=20=D0=BE=D1=88=D0=B8=D0=B1=D0=BA?= =?UTF-8?q?=D0=B0=D1=85=20=D0=B2=20=D0=BF=D1=80=D0=B8=D0=BB=D0=BE=D0=B6?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...20\263\320\260\321\202\320\272\320\260.os" | 49 ++++++++++++++++++- 1 file changed, 48 insertions(+), 1 deletion(-) diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\230\320\232\320\241_\320\240\320\276\320\263\320\260\321\202\320\272\320\260.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\230\320\232\320\241_\320\240\320\276\320\263\320\260\321\202\320\272\320\260.os" index e74b908..7e4b95e 100644 --- "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\230\320\232\320\241_\320\240\320\276\320\263\320\260\321\202\320\272\320\260.os" +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\230\320\232\320\241_\320\240\320\276\320\263\320\260\321\202\320\272\320\260.os" @@ -4,6 +4,9 @@ &Пластилин Перем КонсольноеПриложение; +&Деталька(ЗначениеПоУмолчанию = Истина) +Перем ПоказыватьСтекВызовов; + Перем Лог; Процедура ПриЗапускеПриложения() Экспорт @@ -12,6 +15,12 @@ Попытка КонсольноеПриложение.Запустить(АргументыКоманднойСтроки); Исключение + Если ПоказыватьСтекВызовов Тогда + ПодробныйСтекВызовов = СтекВызововСтрокой(ИнформацияОбОшибке()); + Сообщить("Стек трейс: + |" + ПодробныйСтекВызовов); + КонецЕсли; + // основную ошибку покажем ниже стека вызовов, чтобы пользователю не пришлось скроллить Лог.Ошибка(ОписаниеОшибки()); ВременныеФайлы.Удалить(); // todo: перехватчик "ПриЗавершенииПриложения" в ОСени? @@ -26,4 +35,42 @@ &Рогатка(ЗапускатьВФоне = Ложь) Процедура ПриСозданииОбъекта() Лог = Логирование.ПолучитьЛог("oscript.lib.autumn-cli"); -КонецПроцедуры \ No newline at end of file +КонецПроцедуры + +// Получить стек вызовов строкой для выдачи в логи +// +// Параметры: +// ИнформацияОбОшибке - ИнформацияОбОшибке - ошибка +// +// Возвращаемое значение: +// Строка +// +Функция СтекВызововСтрокой(Знач ИнформацияОбОшибке) Экспорт + СтекВызовов_ = ИнформацияОбОшибке.ПолучитьСтекВызовов(); + МассивТекстИсключения = Новый Массив; + + Отступ = ""; + СимволОтступа = " "; + ПервыйКадр = Истина; + Для Каждого КадрСтекаВызовов Из СтекВызовов_ Цикл + // пропустим первый кадр стека, т.к. он ведет на служебный вызов исключения + Если ПервыйКадр Тогда + ПервыйКадр = Ложь; + Продолжить; + КонецЕсли; + + Отступ = Отступ + СимволОтступа; + + СтрокаСтекТрейса = СтрШаблон( + "%1%2 / Метод %3 / Строка %4", + Отступ, + КадрСтекаВызовов.ИмяМодуля, + КадрСтекаВызовов.Метод, + Формат(КадрСтекаВызовов.НомерСтроки, "ЧГ=") + ); + МассивТекстИсключения.Добавить(СтрокаСтекТрейса); + КонецЦикла; + + Возврат СтрСоединить(МассивТекстИсключения, Символы.ПС); + +КонецФункции From 0a91abad5813c2862d900432ef195a1c6721f33b Mon Sep 17 00:00:00 2001 From: Artur Ayukhanov Date: Tue, 19 Mar 2024 20:32:43 +0300 Subject: [PATCH 2/6] =?UTF-8?q?=D0=B8=D1=81=D0=BA=D0=BB=D1=8E=D1=87=D0=B0?= =?UTF-8?q?=D1=8E=20=D1=81=D1=82=D0=B5=D0=BA=20=D0=9E=D0=A1=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit остается только прикладной стек приложения, без служебного стека ОСени вывод через Лог --- ...40\320\276\320\263\320\260\321\202\320\272\320\260.os" | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\230\320\232\320\241_\320\240\320\276\320\263\320\260\321\202\320\272\320\260.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\230\320\232\320\241_\320\240\320\276\320\263\320\260\321\202\320\272\320\260.os" index 7e4b95e..35daa45 100644 --- "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\230\320\232\320\241_\320\240\320\276\320\263\320\260\321\202\320\272\320\260.os" +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\230\320\232\320\241_\320\240\320\276\320\263\320\260\321\202\320\272\320\260.os" @@ -17,7 +17,7 @@ Исключение Если ПоказыватьСтекВызовов Тогда ПодробныйСтекВызовов = СтекВызововСтрокой(ИнформацияОбОшибке()); - Сообщить("Стек трейс: + Лог.Ошибка("Стек трейс: |" + ПодробныйСтекВызовов); КонецЕсли; // основную ошибку покажем ниже стека вызовов, чтобы пользователю не пришлось скроллить @@ -58,6 +58,12 @@ ПервыйКадр = Ложь; Продолжить; КонецЕсли; + + ЭтоКадрСтекаИзОсени = СтрНачинаетсяС(КадрСтекаВызовов.Метод, "ДекораторВнутренний_") + И СтрНачинаетсяС(КадрСтекаВызовов.ИмяМодуля, " Date: Wed, 20 Mar 2024 11:23:58 +0300 Subject: [PATCH 3/6] =?UTF-8?q?=D0=BF=D0=B5=D1=80=D0=B5=D0=B8=D0=BC=D0=B5?= =?UTF-8?q?=D0=BD=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5=20=D0=B4=D0=B5=D1=82?= =?UTF-8?q?=D0=B0=D0=BB=D1=8C=D0=BA=D0=B8=20+=20=D1=83=D1=82=D0=BE=D1=87?= =?UTF-8?q?=D0=BD=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BF=D1=83=D1=82=D0=B8=20?= =?UTF-8?q?=D0=B2=20=D0=BD=D0=B0=D1=81=D1=82=D1=80=D0=BE=D0=B9=D0=BA=D0=B0?= =?UTF-8?q?=D1=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit замена на ПоказыватьСтекВызововПриОшибкеПриОшибке --- ...40\320\276\320\263\320\260\321\202\320\272\320\260.os" | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\230\320\232\320\241_\320\240\320\276\320\263\320\260\321\202\320\272\320\260.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\230\320\232\320\241_\320\240\320\276\320\263\320\260\321\202\320\272\320\260.os" index 35daa45..2895633 100644 --- "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\230\320\232\320\241_\320\240\320\276\320\263\320\260\321\202\320\272\320\260.os" +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\230\320\232\320\241_\320\240\320\276\320\263\320\260\321\202\320\272\320\260.os" @@ -4,8 +4,8 @@ &Пластилин Перем КонсольноеПриложение; -&Деталька(ЗначениеПоУмолчанию = Истина) -Перем ПоказыватьСтекВызовов; +&Деталька(Значение = "cli.ПоказыватьСтекВызововПриОшибкеПриОшибке", ЗначениеПоУмолчанию = Истина) +Перем ПоказыватьСтекВызововПриОшибке; Перем Лог; @@ -15,7 +15,7 @@ Попытка КонсольноеПриложение.Запустить(АргументыКоманднойСтроки); Исключение - Если ПоказыватьСтекВызовов Тогда + Если ПоказыватьСтекВызововПриОшибке Тогда ПодробныйСтекВызовов = СтекВызововСтрокой(ИнформацияОбОшибке()); Лог.Ошибка("Стек трейс: |" + ПодробныйСтекВызовов); @@ -58,7 +58,7 @@ ПервыйКадр = Ложь; Продолжить; КонецЕсли; - + ЭтоКадрСтекаИзОсени = СтрНачинаетсяС(КадрСтекаВызовов.Метод, "ДекораторВнутренний_") И СтрНачинаетсяС(КадрСтекаВызовов.ИмяМодуля, " Date: Wed, 20 Mar 2024 12:14:36 +0300 Subject: [PATCH 4/6] =?UTF-8?q?=D1=81=D0=BA=D0=BB=D0=B5=D0=B9=D0=BA=D0=B0?= =?UTF-8?q?=20=D1=81=D1=82=D0=B5=D0=BA=D0=B0=20=D0=B2=D1=8B=D0=B7=D0=BE?= =?UTF-8?q?=D0=B2=D0=BE=D0=B2=20=D0=B8=20=D1=82=D0=B5=D0=BA=D1=81=D1=82?= =?UTF-8?q?=D0=B0=20=D0=BE=D1=88=D0=B8=D0=B1=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...40\320\276\320\263\320\260\321\202\320\272\320\260.os" | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\230\320\232\320\241_\320\240\320\276\320\263\320\260\321\202\320\272\320\260.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\230\320\232\320\241_\320\240\320\276\320\263\320\260\321\202\320\272\320\260.os" index 2895633..ea3444a 100644 --- "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\230\320\232\320\241_\320\240\320\276\320\263\320\260\321\202\320\272\320\260.os" +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\230\320\232\320\241_\320\240\320\276\320\263\320\260\321\202\320\272\320\260.os" @@ -17,11 +17,13 @@ Исключение Если ПоказыватьСтекВызововПриОшибке Тогда ПодробныйСтекВызовов = СтекВызововСтрокой(ИнформацияОбОшибке()); + // основную ошибку покажем ниже стека вызовов, чтобы пользователю не пришлось скроллить Лог.Ошибка("Стек трейс: - |" + ПодробныйСтекВызовов); + |%1 + |%2", ПодробныйСтекВызовов, ОписаниеОшибки()); + Иначе + Лог.Ошибка(ОписаниеОшибки()); КонецЕсли; - // основную ошибку покажем ниже стека вызовов, чтобы пользователю не пришлось скроллить - Лог.Ошибка(ОписаниеОшибки()); ВременныеФайлы.Удалить(); // todo: перехватчик "ПриЗавершенииПриложения" в ОСени? From d513e9fd602881a160972214ba146d5b3e528e3a Mon Sep 17 00:00:00 2001 From: Artur Ayukhanov Date: Wed, 20 Mar 2024 12:24:05 +0300 Subject: [PATCH 5/6] =?UTF-8?q?=D0=B4=D0=BE=D0=BA=D1=83=D0=BC=D0=B5=D0=BD?= =?UTF-8?q?=D1=82=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BB=20=D0=BF=D0=BE=D0=BA?= =?UTF-8?q?=D0=B0=D0=B7=20=D1=81=D1=82=D0=B5=D0=BA=D0=B0=20=D0=B2=D1=8B?= =?UTF-8?q?=D0=B7=D0=BE=D0=B2=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 63 +++++++++++++++++++++++++++++++++++++------------------ 1 file changed, 43 insertions(+), 20 deletions(-) diff --git a/README.md b/README.md index 87ae8d8..7a578bf 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# autumn-cli +# autumn-cli Обертка над [cli](https://github.com/khorevaa/cli) библиотекой, которая предоставляет возможности создания консольных приложений на фреймворке [ОСень](https://github.com/autumn-library/autumn). @@ -38,7 +38,7 @@ &КомандаПриложения(Имя = "p plus", Описание = "Прибавляет 10 к заданному числу") // Аннотация, обозначающая, что этот класс - консольная команда Процедура ПриСозданииОбъекта() - + КонецПроцедуры &ВыполнениеКоманды // Метод, помеченный этой аннотацией будет выполнены при вызове команды. @@ -47,15 +47,15 @@ Результат = ПереданноеЧисло + 10; Сообщить("Результат сложения: " + Результат); - + КонецПроцедуры ``` -В этом примере мы определили класс как команду консольного приложения с помощью аннотации +В этом примере мы определили класс как команду консольного приложения с помощью аннотации ```&КомандаПриложения(Имя = "p plus", Описание = "Прибавляет 10 к заданному числу")``` -В которой указали имя команды и ее описание. А для определения аргумента команды, была создана переменная с аннотацией +В которой указали имя команды и ее описание. А для определения аргумента команды, была создана переменная с аннотацией ```&Аргумент(Имя = "ARG", Описание = "Значение числа")``` @@ -74,7 +74,7 @@ &КомандаПриложения(Имя = "H hello", Описание = "Поздоровается с пользователем") Процедура ПриСозданииОбъекта() - + КонецПроцедуры &ВыполнениеКоманды @@ -83,11 +83,11 @@ ТекстСообщения = "Привет " + ИмяПользователя + "!"; Сообщить(ТекстСообщения); - + КонецПроцедуры ``` -В этом примере, для определения опции команды, была создана переменная с аннотацией +В этом примере, для определения опции команды, была создана переменная с аннотацией ```&Опция(Имя = "n name", Описание = "Имя пользователя")``` @@ -97,13 +97,13 @@ ```Каталог/С/Классами/Команд/КомандаДата.os``` ```bsl -&КомандаПриложения(Имя = "d date", +&КомандаПриложения(Имя = "d date", Описание = "Выводит дату", Подкоманда = "ПодкомандаДень", Подкоманда = "ПодкомандаМесяц" ) Процедура ПриСозданииОбъекта() - + КонецПроцедуры ``` @@ -113,7 +113,7 @@ ```bsl &ПодкомандаПриложения(Имя = "day", Описание = "Выводит дату - начало дня") Процедура ПриСозданииОбъекта() - + КонецПроцедуры &ВыполнениеКоманды @@ -128,14 +128,14 @@ ```bsl &ПодкомандаПриложения(Имя = "month", Описание = "Выводит дату - начало месяца") Процедура ПриСозданииОбъекта() - + КонецПроцедуры &ВыполнениеКоманды Процедура СообщитьМесяц() Экспорт Сообщить(НачалоМесяца(ТекущаяДата())); - + КонецПроцедуры ``` @@ -192,7 +192,7 @@ Настройку вывода версии и имени приложения можно осуществить двумя способами. -1) Создать рядом с точкой входа файл +1) Создать рядом с точкой входа файл ```autumn-properties.json``` ```json @@ -227,11 +227,36 @@ КонецФункции ``` +## Настройка показа полного стека вызовов при ошибках приложения + +При ошибках, исключениях внутри приложения вместе с описанием ошибки по умолчанию выдается полный стек вызовов приложения. +Стек служебных вызовов из библиотек ОСени исключается для облегчения чтения логов пользователем. + +Чтобы исключить показ стека вызовов при ошибках, нужно + +- в файле `autumn-properties.json` указать значение `false` для ключа `ПоказыватьСтекВызововПриОшибке` в корневом разделе `cli` +- пример файла +```json +{ + "cli": { + "ИмяПриложения": "cli_test", + "ПолноеИмяПриложения": "cli_test v%{cli.ВерсияПриложения}", + "ВерсияПриложения": "1.0.1", + "ПоказыватьСтекВызововПриОшибке" : false + } +} +``` + +Чтобы включить показ стека вызовов при ошибках, можно +- или задать `true` +- или просто удалить ключ из файла для возврата поведения по умолчанию. + + ## Миграция с [cli](https://github.com/khorevaa/cli) -Инфраструктурный, условный ```main.os``` от вашего приложения не нужен. он должен быть запущен при помощи [ОСени](https://github.com/autumn-library/autumn). Дальше перед вами три пути: +Инфраструктурный, условный ```main.os``` от вашего приложения не нужен. он должен быть запущен при помощи [ОСени](https://github.com/autumn-library/autumn). Дальше перед вами три пути: -Первый - команды модифицировать аннотациями конструктора ```&КомандаПриложения``` или ```&ПодкомандаПриложения```. оставить методы ```ОписаниеКоманды``` и ```ВыполнитьКоманду```, тогда фреймворк поймет что они уже реализованы, и не будет генерировать для них код. +Первый - команды модифицировать аннотациями конструктора ```&КомандаПриложения``` или ```&ПодкомандаПриложения```. оставить методы ```ОписаниеКоманды``` и ```ВыполнитьКоманду```, тогда фреймворк поймет что они уже реализованы, и не будет генерировать для них код. Второй - команды модифицировать аннотациями конструктора ```&КомандаПриложения``` или ```&ПодкомандаПриложения```. убрать методы ```ОписаниеКоманды``` и ```ВыполнитьКоманду```, и создать поля класса, с необходимыми аннотациями, и метод с аннотацией ```&ВыполнениеКоманды```. В таком случае фреймворк сгенерит все остальное за вас. @@ -245,13 +270,13 @@ КонецПроцедуры Процедура ОписаниеКоманды(Знач КомандаПриложения) Экспорт - + КомандаПриложения.Опция("n name", "", "Имя пользователя"); КонецПроцедуры Процедура ВыполнитьКоманду(Знач КомандаПриложения) Экспорт - + ИмяПользователя = КомандаПриложения.ЗначениеОпции("name"); Сообщить("Привет " + ИмяПользователя); @@ -279,5 +304,3 @@ ## Больше примеров Описанные классы можно посмотреть в каталоге [example](example/) и еще больше примеров команд в каталоге [tests](tests/Классы) - - From 26517c49679b5868b6a78cff1db66039c96251e4 Mon Sep 17 00:00:00 2001 From: Artur Ayukhanov Date: Wed, 20 Mar 2024 12:58:48 +0300 Subject: [PATCH 6/6] =?UTF-8?q?=D0=BF=D0=B0=D1=80=D0=B0=D0=BC=D0=B5=D1=82?= =?UTF-8?q?=D1=80=20=D0=98=D1=81=D0=BA=D0=BB=D1=8E=D1=87=D0=B0=D1=82=D1=8C?= =?UTF-8?q?=D0=A1=D1=82=D0=B5=D0=BA=D0=98=D0=B7=D0=9E=D1=81=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=20+=20=D0=B2=D1=8B=D0=B4=D0=B5=D0=BB=D0=B8=D0=BB=20?= =?UTF-8?q?=D0=BC=D0=B5=D1=82=D0=BE=D0=B4=20=D0=AD=D1=82=D0=BE=D0=9A=D0=B0?= =?UTF-8?q?=D0=B4=D1=80=D0=A1=D1=82=D0=B5=D0=BA=D0=B0=D0=98=D0=B7=D0=9E?= =?UTF-8?q?=D1=81=D0=B5=D0=BD=D0=B8=20+=20=D0=BF=D0=B0=D1=80=D0=B0=D0=BC?= =?UTF-8?q?=D0=B5=D1=82=D1=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit убрал ненужный Экспорт --- ...0\276\320\263\320\260\321\202\320\272\320\260.os" | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\230\320\232\320\241_\320\240\320\276\320\263\320\260\321\202\320\272\320\260.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\230\320\232\320\241_\320\240\320\276\320\263\320\260\321\202\320\272\320\260.os" index ea3444a..aa1640a 100644 --- "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\230\320\232\320\241_\320\240\320\276\320\263\320\260\321\202\320\272\320\260.os" +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\230\320\232\320\241_\320\240\320\276\320\263\320\260\321\202\320\272\320\260.os" @@ -43,11 +43,12 @@ // // Параметры: // ИнформацияОбОшибке - ИнформацияОбОшибке - ошибка +// ИсключатьСтекОсени - Булево - исключать стек вызовов библиотек ОСени или нет // // Возвращаемое значение: // Строка // -Функция СтекВызововСтрокой(Знач ИнформацияОбОшибке) Экспорт +Функция СтекВызововСтрокой(Знач ИнформацияОбОшибке, Знач ИсключатьСтекОсени = Истина) СтекВызовов_ = ИнформацияОбОшибке.ПолучитьСтекВызовов(); МассивТекстИсключения = Новый Массив; @@ -61,9 +62,7 @@ Продолжить; КонецЕсли; - ЭтоКадрСтекаИзОсени = СтрНачинаетсяС(КадрСтекаВызовов.Метод, "ДекораторВнутренний_") - И СтрНачинаетсяС(КадрСтекаВызовов.ИмяМодуля, "