GWT. Обработка серверных исключений на клиенте.


В целом обработка исключений при работе в GWT через RPC довольно детально описана в разделе документации DevGuideHandlingExceptions

Важный момент на который следуют обратить внимание – throws для метода.

Например, вот Ваш интерфейс:

public interface MyService extends RemoteService {
  public String myMethod(String s);
}

Допустим Вы сделали класс MyException который наследуется от RuntimeException. Например, это исключение вы создали для своих прикладных нужд и хотите чтобы оно могло быть перекинуто и обработано на клиенте.

Это конечно удобно, т.к. полученный тип исключений является Unchecked Exception. Таким образом его не нужно явно декларировать, оно может произойти где угодно (не надо прописывать везде throws) и такое исключение Вы не обязаны явно отлавливать. 

Другими словами,  мы же не пишем для каждого метода throws RuntimeException!

Тем не менее, если где-то у Вас в программе произойдет это исключение:

public class MyServiceImpl extends RemoteServiceServlet implements
    MyService {

  public String myMethod(String s) {
    // Do something interesting with 's' here on the server.
    if (isError() ) { throw new MyException("ups");  
    // 
    return s;
  }
}

То это исключение в методе onFailure(Throwable caught) будет передано просто как InvocationException, а не как MyException!
Дело в том, что если заглянуть в реализацию метода обработки вызова RPC-вызовов:

RemoteServiceServlet. processCall() → RPC.invokeAndEncodeResponse() → RPC.encodeResponseForFailure() → RPCServletUtils.isExpectedException()
мы найдем использование следующей конструкции:

Class< ?>[] exceptionsThrown = serviceIntfMethod.getExceptionTypes();

Другими словами, если Вы хотите чтобы Ваше исключение попадало в onFailure(Throwable caught) как MyException, то нужно обязательно декларировать throws, даже если Ваше исключение extends RuntimeException!

В нашем примере это будет выглядеть так:

public interface MyService extends RemoteService {
  public String myMethod(String s) throws MyException;
}

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

Любое использование либо копирование материалов или подборки материалов сайта, элементов дизайна и оформления допускается лишь с разрешения правообладателя и только со ссылкой на источник: programador.ru

Телеграм канал: @prgrmdr
Почта для связи: vit [at] programmisty.com