Трансляторы исключений – это простые сервисы с методом Translate, которые принимают на вход исключение и возвращают транслированный результат. Если вернуть транслированный результат не получается, возвращают null. Пользовательские трансляторы выполняются после системных трансляторов, но перед трансляцией исключений. К системным трансляторам, относится, например, транслятор, который по имени констрейнта сообщает название объекта и свойства: невозможно удалить запись, поскольку на нее ссылается справочник такой-то, поле такое-то (если объект не описан в метаданных, в сообщении будет название таблицы и колонки).
От трансляций исключений трансляторы отличает использование скриптов, что дает более гибкий подход к обработке исключений, но делает их немного более сложными в применении.
Перечень всех пользовательских трансляторов исключений можно найти в справочнике Exception translators:
Записи справочника можно фильтровать по Названию транслятора (Description) и Тегам (Tag).
Транслятор исключений обладает следующими свойствами:
•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; } } } |