Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Показ стека вызовов при ошибках в приложении #8

Open
wants to merge 6 commits into
base: master
Choose a base branch
from
55 changes: 54 additions & 1 deletion src/Классы/ИКС_Рогатка.os
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,9 @@
&Пластилин
Перем КонсольноеПриложение;

&Деталька(ЗначениеПоУмолчанию = Истина)
Nivanchenko marked this conversation as resolved.
Show resolved Hide resolved
Перем ПоказыватьСтекВызовов;

Перем Лог;

Процедура ПриЗапускеПриложения() Экспорт
Expand All @@ -12,6 +15,12 @@
Попытка
КонсольноеПриложение.Запустить(АргументыКоманднойСтроки);
Исключение
Если ПоказыватьСтекВызовов Тогда
ПодробныйСтекВызовов = СтекВызововСтрокой(ИнформацияОбОшибке());
Лог.Ошибка("Стек трейс:
|" + ПодробныйСтекВызовов);
КонецЕсли;
// основную ошибку покажем ниже стека вызовов, чтобы пользователю не пришлось скроллить
Лог.Ошибка(ОписаниеОшибки());
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

А зачем и то и то показывать? Разве у стек трейсе не будет описания ошибки? Если нет, то лучше этот вывод склеить в одну строку и вывести одновременно, так как между строками лога может вмешаться вывод из других потоков.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

А зачем и то и то показывать? Разве у стек трейсе не будет описания ошибки? Если нет, то лучше этот вывод склеить в одну строку и вывести одновременно, так как между строками лога может вмешаться вывод из других потоков.

1 ага, в стек-трейсе не будет описания ошибки

2 лады, склею также, как сейчас

  • сначала стек
  • затем финальная ошибка - так будет понятнее пользователю и меньше скроллить

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

склеил


ВременныеФайлы.Удалить(); // todo: перехватчик "ПриЗавершенииПриложения" в ОСени?
Expand All @@ -26,4 +35,48 @@
&Рогатка(ЗапускатьВФоне = Ложь)
Процедура ПриСозданииОбъекта()
Лог = Логирование.ПолучитьЛог("oscript.lib.autumn-cli");
КонецПроцедуры
КонецПроцедуры

// Получить стек вызовов строкой для выдачи в логи
//
// Параметры:
// ИнформацияОбОшибке - ИнформацияОбОшибке - ошибка
//
// Возвращаемое значение:
// Строка
//
Функция СтекВызововСтрокой(Знач ИнформацияОбОшибке) Экспорт
СтекВызовов_ = ИнформацияОбОшибке.ПолучитьСтекВызовов();
МассивТекстИсключения = Новый Массив;

Отступ = "";
СимволОтступа = " ";
ПервыйКадр = Истина;
Для Каждого КадрСтекаВызовов Из СтекВызовов_ Цикл
// пропустим первый кадр стека, т.к. он ведет на служебный вызов исключения
Если ПервыйКадр Тогда
ПервыйКадр = Ложь;
Продолжить;
КонецЕсли;

ЭтоКадрСтекаИзОсени = СтрНачинаетсяС(КадрСтекаВызовов.Метод, "ДекораторВнутренний_")

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Тянет на отдельный метод

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

согласен, выделяю отдельный метод ЭтоКадрСтекаИзОсени(КадрСтекаВызовов)

И СтрНачинаетсяС(КадрСтекаВызовов.ИмяМодуля, "<string");
Если ЭтоКадрСтекаИзОсени Тогда
Прервать;
КонецЕсли;

Отступ = Отступ + СимволОтступа;

СтрокаСтекТрейса = СтрШаблон(
"%1%2 / Метод %3 / Строка %4",
Отступ,
КадрСтекаВызовов.ИмяМодуля,
КадрСтекаВызовов.Метод,
Формат(КадрСтекаВызовов.НомерСтроки, "ЧГ=")
);
МассивТекстИсключения.Добавить(СтрокаСтекТрейса);
КонецЦикла;

Возврат СтрСоединить(МассивТекстИсключения, Символы.ПС);

КонецФункции