Необработанные исключения в блоках Web Client и Desktop Client, возникшие на клиентском уровне или переданные с Middleware, попадают в специальный механизм обработчиков. Этот механизм реализован в модуле GUI и доступен обоим клиентам.
Обработчик должен быть управляемым бином, реализовывать интерфейс
GenericExceptionHandler
, в методе handle()
которого производить обработку и возвращать true
, либо сразу возвращать false
, если
данный обработчик не может обработать переданное ему исключение. Такое поведение позволяет организовать "цепочку
ответственности" обработчиков.
Рекомендуется наследовать классы своих обработчиков от базового класса AbstractGenericExceptionHandler
,
который умеет разбирать цепочку исключений (с учетом упакованных внутри RemoteException
) и
реагировать на конкретные типы исключений. Типы исключений, для которых предназначен данный обработчик,
указываются в массиве строк, передаваемом в конструкторе обработчика базовому конструктору. Каждая строка массива
должна содержать одно полное имя класса обрабатываемого исключения, например:
@ManagedBean("cuba_EntityAccessExceptionHandler") public class EntityAccessExceptionHandler extends AbstractGenericExceptionHandler { public EntityAccessExceptionHandler() { super(EntityAccessException.class.getName()); } ...
Если класс исключения недоступен на клиенте, следует указывать его имя строковым литералом:
@ManagedBean("cuba_OptimisticExceptionHandler") public class OptimisticExceptionHandler extends AbstractGenericExceptionHandler implements Ordered { public OptimisticExceptionHandler() { super("org.springframework.orm.jpa.JpaOptimisticLockingFailureException"); } ...
В случае использования в качестве базового класса AbstractGenericExceptionHandler
логика обработки
располагается в методе doHandle()
, и может выглядеть следующим образом:
@Override protected void doHandle(String className, String message, @Nullable Throwable throwable, WindowManager windowManager) { String msg = messages.getMainMessage("zeroBalance.message"); windowManager.showNotification(msg, IFrame.NotificationType.ERROR); }
Если имени класса исключения недостаточно для того, чтобы принять решение о применимости данного обработчика
к исключению, следует определить метод canHandle()
, получающий кроме прочего текст исключения. Метод должен
вернуть true
, если данный обработчик применим для исключения. Например:
@ManagedBean("cuba_NumericOverflowExceptionHandler") public class NumericOverflowExceptionHandler extends AbstractGenericExceptionHandler { public NumericOverflowExceptionHandler() { super(ReportingSQLException.class.getName()); } @Override protected boolean canHandle(String className, String message, @Nullable Throwable throwable) { return StringUtils.containsIgnoreCase(message, "Numeric field overflow"); } ...