Попытка //Некоторые действия Исключение //Действия при ошибке КонецПопытки;
Показ сообщения об ошибке
Для вывода сообщения об ошибке нужно использовать функцию ОписаниеОшибки();
Пример:
Попытка НаборЗаписей.Записать(Истина); Исключение Сообщить(ОписаниеОшибки()); КонецПопытки;
Для выдачи структуированной информации об ошибке в версии 8.2 служит функция ИнформацияОбОшибке().
Инфо = ИнформацияОбОшибке(); Сообщить("Описание='" + Инфо.Описание + "'"); Сообщить("ИмяМодуля='" + Инфо.ИмяМодуля + "'"); Сообщить("НомерСтроки=" + Инфо.НомерСтроки); Сообщить("ИсходнаяСтрока='" + Инфо.ИсходнаяСтрока + "'");
Вызов исключения
В 1С:Предприятие 7.7 оператор ВызватьИсключение; служит для повторного вызова исключения из блока Исключение-КонецПопытки. Для вызова из других частей программы можно использовать внешнюю компоненту или деление на 0, например а=1/0.
В 1С:Предприятие версии 8 есть оператор ВызватьИсключение:
ВызватьИсключение "Текст сообщения об ошибке";
Если при исполнении программы происходит ошибка, то 1С сообщает о ней пользователю.
Сообщение обычно производится в окне с красным крестом, откуда такие сообщения называют «поймать красный крест» или «не работает, есть красные ошибки».
Конструкция 1С Попытка-Исключение служит для обработки возможных ошибочных ситуаций.
Хорошим тоном считается обрабатывать ошибки с помощью конструкции 1С Попытка-Исключение, то есть предусматривать места, где они могут произойти и ставить обработчик, который запишет ошибку «в сообщения администратору», а пользователю или сообщит корректно или найдет способ отработать по-другому.
Переменная1 = "22";
Попытка
//код, который может вызвать ошибку
ЧислоСтрокой = Число(Переменная1);
Исключение
ТекстОшибки = ОписаниеОшибки();
КонецПопытки
Код, в котором может произойти ошибка, обрамляется оператором 1С Попытка-Исключение.
В случае, если ошибка происходит, срабатывает выполнение кода между Исключение и КонецПопытки. Если ошибка не происходит, тот код между Исключение и КонецПопытки не выполняется.
Чтобы получить расшифровку ошибки, необходимо получить текст ошибки с помощью функции ОписаниеОшибки() сразу после слова Исключение.
Также существует функция ИнформацияОбОшибке(), которую можно вызывать вместо ОписаниеОшибки(). Разница в том, что она возвращает информацию в структурированном виде, а не строкой.
Структура, возвращаемая функцией ИнформацияОбОшибке():
Проголосовать за этот пост:
Загрузка…
Posted in Язык 1С
Содержание:
1. Обработка исключительной ситуации
2. Совершаем ошибку в 1С 8.3
3. А что еще можно делать с результатом попытки?
4. А ваши транзакции то здесь при чём?
1. Обработка исключительной ситуации
— Приветствую, Амиго! Ты, как я понял, пришёл на мою лекцию по физическим основам изготовления термитных пирамидок для заряда аппаратов гиперболоидной конструкции? Нет? А зачем тогда?
— Здравствуйте, профессор. Сегодня мы собирались разобрать конструкцию «Попытка-Исключение».
— А… Это… Ну, тогда вот:
— Кажется, понятно. А можно примеров добавить?
— Ох уж эти юные роботы, всегда хотят практики. С примерами это будет выглядеть вот так:
Ох, извини, это для старых баз. На новых космолётах с прошивкой выше 8.1 есть более удобный способ узнать код ошибки.
2. Совершаем ошибку в 1С 8.3
Ты и сам можешь попробовать. Главное – придумать ошибку в 1С 8.3. Самая простая ошибка – это разделить что-нибудь на нуль или на, как это говорят на современном сленге, ноль.
В ответ получим:
Нажимаем на кнопку «Подробно…» и видим: Деление на 0 {NudlsProff_Расширение.NudlsProff_ФормаОшибок.Форма(96)}: Результат = 1/0
Добавляем нашей красоты:
Теперь пользователю ВИДНО, что случилось. И ПОНЯТНО, что с этим делать.
Описание=’Деление на 0′
ИмяМодуля=’NudlsProff_Расширение.NudlsProff_ФормаОшибок.Форма’
НомерСтроки=99
ИсходнаяСтрока=’ Результат = 1 / 0;’
Позвоните Профессору Нудлсупо тел+7 (495) 125-23-77
и ознакомьтесь с теорией деления на ноль
https://elementy.ru/email/1530320/Pochemu_nelzya_delit_na_nol
3. А что еще можно делать с результатом попытки?
— А что ещё мы можем делать в результате с попыткой?
— Мы можем обработать попытку в попытке.
По своей сути Попытка-Исключение – это отлов исключительной ситуации. Ситуации, которая может произойти. Возможно, даже и не по вине юного робота. Робот же должен учесть все возможные ситуации при написании кода и обработать их. Но наш мир не идеален и даже программы не всегда работают идеально. Именно тогда мы и должны проанализировать возможные последствия и понять, что для нас важнее: чтобы код выполнился до конца или вызвать прерывание работы ошибочного кусочка кода, но дать пользователю исправить ситуацию и продолжить работу.
— Профессор, Вы опять забыли про примеры.
— Ах, да, конечно. Например, мы записывали файл на диск. Пользователь, конечно, выбрал папку для записи файла, но случайно удалил её во время работы программы. Вся наша программа рухнет из-за невнимательности.
Нельзя просто обернуть код в попытку и обезопасить себя от последствий. Также неправильно и маскировать ошибку общими фразами – дальнейший поиск и исправление этого бага вызовет уйму вопросов. Нужно показать максимально информативное сообщение пользователю, чтобы он передал его в службу поддержки. Всё-же, исключительная ситуация – это баг, который нужно исправлять.
4. А ваши транзакции то здесь при чем?
— То есть если в программе что-то может пойти не так, например, при записи файла на диск, обработке web-hook, работе с API, синхронизации с другими базами, записи изменений в справочник или документ, для безопасности я должен обернуть потенциально опасный кусочек кода в Попытку-Исключение, и тем самым пользователь сможет продолжить работу, а мы всегда будем знать, где именно и почему возникает ошибка?
— Да, Амиго, все верно! Кстати, поскольку уж речь зашла о записи объектов баз данных, очень важно не забывать правильно закрывать ваши транзакции:
Специалист компании «Кодерлайн»
Алексей Зятнин
Если вы используете в своем программном коде конструкцию Попытка … Исключение, но при возникновении какой либо ошибки хотели бы видеть ее описание, то вам необходимо использовать встроенную функцию ОписаниеОшибки().
Пример:
Попытка
//Ваш код
Исключение
Сообщить("Произошла ошибка: " + ОписаниеОшибки());
КонецПопытки;
Таким образом при возникновении исключения, вам в сообщении будут выводится пояснения к нему.
Вконтакте
Google+
LiveJournal
Одноклассники
Мой мир
- Главная
- О сайте
- Главная
- Содержание
Категории
—>
рубрики: Язык программирования 1С | Дата: 2 марта, 2017
Как известно ничего идеального в этом мире нет, в том числе и программ. И 1С в этом плане не исключение. И бывает так, что выполнение кода завершается ошибкой. В этом случае пользователю выдается системное сообщение об ошибке из которого как правило мало что можно понять.
К тому же часто необходимо, чтобы несмотря на возникновение ошибки программа продолжила свою работу. Например, когда мы загружаем в базу 1С большой объем данных (элементы справочников, документы и т.д.) совершенно недопустимо, чтобы в случае сбоя во время загрузки одного элемента у нас остановилась вся дальнейшая загрузка. Так вот для обработки таких исключительных ситуаций предназначена конструкция языка 1С Попытка Исключение. Синтаксис ее следующий:
Попытка
//Выполняемый код
Исключение
//Обработка исключительной ситуации:
//- Сообщение пользователю;
//- Запись лога в файл;
//- Отправка сообщения по электронной почте;
//- Фиксация ошибки путем присвоения переменной соответствующего значения
КонецПопытки;
Рассмотрим все вышесказанное на элементарном примере. Для начала искусственно создадим ситуацию с ошибкой. Сделаем это очень просто — путем деления на ноль.
&НаКлиенте
Процедура ВыполнитьДеление(Команда)
Частное = 1 / 0;
КонецПроцедуры
При выполнении этого кода выводится вот такое системное сообщение об ошибке:
А теперь доработаем нашу процедуру с использованием Попытки
&НаКлиенте
Процедура ВыполнитьДеление(Команда)
Попытка
Частное = 1 / 0;
Исключение
Сообщить("Произошла ошибка при попытке деления");
КонецПопытки;
КонецПроцедуры
Снова запустим на выполнение нашу процедуру. В этот раз системное сообщение об ошибке показано не будет, а будет выведено наше собственное сообщение, которое мы прописали в исключении. В исключении можно получить дополнительную информацию об ошибке с помощью метода ОписаниеОшибки(). Вот таким образом
Сообщить("Произошла ошибка при попытке деления" + ОписаниеОшибки());
В этом случае в момент выполнения деления в окне сообщений появится следующий текст
Произошла ошибка при попытке деления{ВнешняяОбработка.ПопыткаИсключение.Форма.Форма.Форма(34)}: Деление на 0
Попытки могут быть вложенными одна в другую. То есть вполне допустимым является следующая конструкция
Попытка
//Код
Попытка
//Код
Исключение
//Обработка исключения
КонецПопытки;
Попытка
//Код
Исключение
//Обработка исключения
КонецПопытки;
Исключение
//Обработка исключения
КонецПопытки;
Это может потребоваться в случае объемного кода, когда мы хотим локализовать место возникновения ошибки.
Конечно не стоит злоупотреблять использованием конструкции Попытка Исключение. По сути ее использование целесообразно в следующих случаях
- Когда несмотря на возникновение ошибки необходимо продолжить выполнение кода.
- Когда необходимо сигнализировать пользователю или администратору о факте возникновении исключительной ситуации, либо о месте ее возникновения. Особенно актуально это при использовании фоновых заданий, т.к. если оно завершается аварийно, то можно увидеть только сам факт этого аварийного завершения в журнале регистрации. И в этом случае отправка письма администратору с описанием причины и места возникновения ошибки в обработке исключения очень даже уместна.