Перехват исключений в коде

#std499

Область применения: управляемое приложение, мобильное приложение, обычное приложение.

1. Не следует перехватывать исключения, кроме случаев ниже. Необработанное исключение выводится пользователю, записывается в журнал регистрации для администратора и при необходимости отправляется в сервис регистрации ошибок средствами платформы 1С:Предприятие. Для распространенных исключений в платформе 1С:Предприятие предусмотрены категории ошибок и шаблоны с соответствующими сообщениями и рекомендациями. В сервис регистрации отправляются ошибки программного кода, такие как "Значение не является значением объектного типа", "Поле объекта не обнаружено", "Слишком много фактических параметров", "Ошибка при вызове метода контекста" и многие другие.

2. В ряде случаев технологический текст исключения непонятен, поэтому его нужно дополнить прикладной, понятной пользователю информацией, типовыми причинами или рекомендациями по устранению возникшей проблемы. К этой категории проблем относятся, как правило, недоступность внешних ресурсов и каналов связи, некорректная работа внешних сервисов, некорректные входные данные и некорректные настройки используемых внешних приложений. Например, это проблемы взаимодействия с почтовыми серверами, веб-сервисами, принтерами, криптопровайдерами.

2.1. В таком случае допустимо перехватить и пробросить исключение без потери исходного содержания с необходимым уточнением. 

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

Для проверки вывода исключений пользователю рекомендуется запускать 1С:Предприятие без отладки и без режима технического специалиста, т.к. в зависимости от этого в платформе 1С:Предприятие внешний вид и поведение окна исключения различается. 

2.2. В особых случаях может быть предусмотрена собственная обработка исключений с расширенной диагностикой проблем, как например в обработчиках обновления информационной базы. 

В таких случаях исключение не перевызывается, а обрабатывается. При этом следует:

При этом не следует:

3. Частные случаи некорректного перехвата исключений.

Область применения (уточнение): управляемое приложение, обычное приложение.

3.1. Не следует анализировать текст исключений с целью интерпретации причины ошибки. Текст исключения может меняться в зависимости от локализации версий платформы и конфигурации. Следует выдавать пользователю тексты исключений «как есть». Для понятности, текст можно уточнить описанием прикладной операции, а также дополнить пояснением возможных причин, если для категории ошибки в платформе не предусмотрено стандартное пояснение или его недостаточно. 

Например:

Попытка
    ЗагрузитьФайлИзИнтернета(...);
Исключение
    ИнформацияОбОшибке = ИнформацияОбОшибке();
    ТекстСообщения = ОбработкаОшибок.СообщениеОбОшибкеДляПользователя(ИнформацияОбОшибке);
    ТекстСообщения = НСтр("ru = 'Не удалось загрузить файл классификатора АУЦ:'") 
       + Символы.ПС + ТекстСообщения 
       + Символы.ПС + НСтр("ru = 'Возможные причины:
       | • Нет подключения к Интернету;
       | • На веб-узле возникли неполадки;
       | • Брандмауэр или другое промежуточное ПО (антивирусы и т.п.) блокируют попытки программы подключиться к Интернету;
       | • Подключение к Интернету выполняется через прокси-сервер, но его параметры не заданы в программе.'");
    ДляАдминистратора = ДиагностикаСоединенияСИнтернет(); // В подробное представление ошибки для журнала регистрации.
    ВызватьИсключение(ТекстСообщения,,, ДляАдминистратора, ИнформацияОбОшибке);
КонецПопытки;

При использовании в конфигурации Библиотеки стандартных подсистем (БСП), следует применять функцию ОбщегоНазначенияКлиентСервер.УточнениеИсключения:

Попытка
    ЗагрузитьФайлИзИнтернета(...);
Исключение
    ИнформацияОбОшибке = ИнформацияОбОшибке();
    Уточнение = ОбщегоНазначенияКлиентСервер.УточнениеИсключения(ИнформацияОбОшибке,
       НСтр("ru = 'Не удалось загрузить файл классификатора АУЦ:'"));
    Уточнение.Текст = Уточнение.Текст + Символы.ПС + НСтр("ru = 'Возможные причины:
       | • Нет подключения к Интернету;
       | • На веб-узле возникли неполадки;
       | • Брандмауэр или другое промежуточное ПО (антивирусы и т.п.) блокируют попытки программы подключиться к Интернету;
       | • Подключение к Интернету выполняется через прокси-сервер, но его параметры не заданы в программе.'");
    ДляАдминистратора = ДиагностикаСоединенияСИнтернет(); // В подробное представление ошибки для журнала регистрации.
    ВызватьИсключение(Уточнение.Текст, Уточнение.Категория,, ДляАдминистратора, ИнформацияОбОшибке);

КонецПопытки;

3.2. Недопустимо перехватывать любые исключения, бесследно для системного администратора:

Попытка
    // код, приводящий к вызову исключения
    ....
Исключение // перехват любых исключений
КонецПопытки;

Как правило, подобная конструкция скрывает реальную проблему, которую впоследствии невозможно диагностировать.
Правильно:

Попытка
    // код, приводящий к вызову исключения
    ....
Исключение
    // Пояснение причин перехвата всех исключений "незаметно" от пользователя.
    // ....
    // И запись события в журнал регистрации для системного администратора.
    ЗаписьЖурналаРегистрации(НСтр("ru = 'Выполнение операции'"),
       УровеньЖурналаРегистрации.Ошибка,,,
       ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;

См. также Доступ к файловой системе из кода конфигурации, удаление временных файлов.

4. Порядок обработки исключений при использовании транзакций описан в стандарте Транзакции: правила использования.