#std790¶
Вызов исключений в коде¶
1.¶
В общем случае исключения в коде вызывать не требуется.
При ошибках в выполнении кода исключение формирует платформа, после чего:
- пользователю выводится сообщение с рекомендацией;
- в журнал регистрации пишется подробная диагностика со стеком вызовов;
- при необходимости данные отправляются в сервис регистрации ошибок платформы.
Пример 1
Исключение платформы с категорией ОшибкаДоступаКЛокальномуФайлу.

Запись журнала регистрации с событием Ошибка выполнения и комментарием:
Пример 2
Исключение платформы с категорией ПрочаяОшибка.

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

Правильно
Если Не РольДоступна("ПодключениеИнтернетПоддержки") Тогда
ТекстОшибки = НСтр("ru = 'Недостаточно прав для записи данных аутентификации Интернет-поддержки.'");
ДляАдминистратора = НСтр("ru = 'Нет роли:'") + " " + Метаданные.Роли.ПодключениеИнтернетПоддержки.Представление();
ВызватьИсключение(ТекстОшибки, КатегорияОшибки.НарушениеПравДоступа,, ДляАдминистратора);
КонецЕсли;
Сообщение пользователю:

2.2.¶
Для диагностики программных ошибок (некорректные параметры, неверно встроенная подсистема и т.п.) используйте категорию ОшибкаКонфигурации.
Такие ошибки адресованы разработчику, а не пользователю.
Пример
Если ТипЗнч(Количество) <> Тип("Число") Тогда
ТекстОшибки = НСтр("ru = 'Недопустимое значение параметра'") + " " + "Количество";
ВызватьИсключение(ТекстОшибки, КатегорияОшибки.ОшибкаКонфигурации);
КонецЕсли;
Сообщение пользователю:

2.3.¶
Если анализ типа исключения критичен для бизнес-логики, используйте один из подходов:
- не вызывать исключения, а возвращать строковые коды ошибок;
- анализировать категорию ошибки исключения, вызванного платформой;
- вызывать исключение со строковым кодом ошибки (параметр
КодуВызватьИсключение).
Числовые коды ошибок использовать не рекомендуется: их сложнее читать и сопровождать.
2.3.1.¶
Пример
2.3.2.¶
Пример
НомерПопытки = 1;
Пока НомерПопытки < 4 Цикл
Попытка
HTTPОтвет = HTTPСоединение.ОтправитьДляОбработки(HTTPЗапрос);
Исключение
ИнформацияОбОшибке = ИнформацияОбОшибке();
Если ИнформацияОбОшибке.ЯвляетсяОшибкойКатегории(КатегорияОшибки.ОшибкаСети) Тогда
НомерПопытки = НомерПопытки + 1;
Продолжить;
КонецЕсли;
ВызватьИсключение;
КонецПопытки;
КонецЦикла;
2.3.3.¶
Пример вызова исключения со строковым кодом
Для уникальности кода включайте префикс подсистемы, например:
СтандартныеПодсистемы.БазоваяФункциональность.КонфигурацияИзмененаДинамически;СтандартныеПодсистемы.БазоваяФункциональность.РасширенияИзмененыДинамически.
Пример обработки такого исключения
Попытка
ВыполнитьОбновление();
Исключение
КодОшибки = ИнформацияОбОшибке().Код;
Если КодОшибки = "СтандартныеПодсистемы.БазоваяФункциональность.КонфигурацияИзмененаДинамически"
Или КодОшибки = "СтандартныеПодсистемы.БазоваяФункциональность.РасширенияИзмененыДинамически" Тогда
ПерезапуститьЗаданиеОбновления();
Возврат;
КонецЕсли;
ВызватьИсключение;
КонецПопытки;
Если используется БСП, удобно применять ОбщегоНазначенияКлиентСервер.ЭтоИсключениеСКодомОшибки().
Метод рекурсивно ищет коды в цепочке вложенных исключений (ИнформацияОбОшибке().Причина).
Пример с использованием БСП
Попытка
ВыполнитьОбновление();
Исключение
Если ОбщегоНазначенияКлиентСервер.ЭтоИсключениеСКодомОшибки(ИнформацияОбОшибке(),
"СтандартныеПодсистемы.БазоваяФункциональность.КонфигурацияИзмененаДинамически
|СтандартныеПодсистемы.БазоваяФункциональность.РасширенияИзмененыДинамически") Тогда
ПерезапуститьЗаданиеОбновления();
Возврат;
КонецЕсли;
ВызватьИсключение;
КонецПопытки;
3.¶
Не используйте исключения в обработчиках ОбработкаПроверкиЗаполнения, ОбработкаПроведения, ПередЗаписью, ПриЗаписи, ПередУдалением и т.п. для обычных блокирующих предупреждений пользователю.
Вместо этого устанавливайте Отказ = Истина и выводите сообщение.
Пользователь должен видеть все блокирующие причины сразу, а не по одной.
Исключение
Если пользователь не может обработать предупреждение в рамках текущей операции или ошибка имеет исключительный характер и делает остальные проверки бессмысленными.
Подробнее: #std400: Информирование пользователя, пп. 1.1 и 1.3.