Трансляторы исключений

Трансляторы исключений – это простые сервисы с методом Translate, которые принимают на вход исключение и возвращают транслированный результат. Если вернуть транслированный результат не получается, возвращают null. Пользовательские трансляторы выполняются после системных трансляторов, но перед трансляцией исключений. К системным трансляторам, относится, например, транслятор, который по имени констрейнта сообщает название объекта и свойства: невозможно удалить запись, поскольку на нее ссылается справочник такой-то, поле такое-то (если объект не описан в метаданных, в сообщении будет название таблицы и колонки).

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

Перечень всех пользовательских трансляторов исключений можно найти в справочнике Exception translators:

ExceptionTranslators_ListForm

Записи справочника можно фильтровать по Названию транслятора (Description) и Тегам (Tag).

Транслятор исключений обладает следующими свойствами:

ExceptionTranslators_EditForm

Caption – название транслятора;

Script – ссылка на скрипт транслятора. При создании нового транслятора скрипт создается автоматически при его сохранении. Нажатие на ссылку Click here to edit the script... при создании нового транслятора приведет к его сохранению и перезагрузке, затем откроется форма редактирования скрипта;

Folder – группа, которой принадлежит транслятор;

Sort index – индекс сортировки, который определяет порядок выполнения трансляторов. Первым выполняется транслятор с наименьшим значением индекса и далее по возрастанию значения индекса до первого удачного выполнения (если в трансляторе, выполненном удачно, не указано обратного);

Metadata tags – теги, используемые для описания функционала транслятора;

Developer's comments – комментарии прикладного разработчика.

Пример транслятора:

namespace Ultima.Scripting.Exceptions

{

 public Exception Translate(Exception ex)

 {

         // проверка условия

         if (ex.WithInnerExceptions().Any(x => x.Message == "Untranslated"))

         {

                 // проверка сериализуемости оригинального исключения

                 if (!ex.IsSafelySerializable())

                         {

                                 ex = ex.ToSerializable();

                         }

 

                 // возвращение транслированного исключения

                 return new UltimaException("Translated", ex);

         }

 

         // исключение не удовлетворяет проверяемым условиям

         return null;

 }

 

 public bool StopOnSuccess

 {

         // не выполнять следующий транслятор, если этот отработал успешно

         get { return true; }

 }

}