Я хочу обернуть все исходящие исключения с сервера GWT (только сервер, ничего на клиенте):
public class AuthServiceImpl extends RemoteServiceServlet implements AuthService {
public String loginAttemt(String username, String password) {
AwesomeUser user = AwesomeUserDao.forUsername(username);
if(BCrpyt.checkpw(user.getPasshash(), password)) {
String code = magicallyGenerateErrorCode();
logger.error("Invalid login attempt - error code" + code);
throw new AwesomeException("password", "Invalid username or password", code);
}
}
}
@RemoteServiceRelativePath("auth")
public interface AuthService extends RemoteService {
String loginAttempt(String username, String password) throws AwesomeException;
}
public interface AuthServiceAsync {
void loginAttempt(String username, String password, AsyncCallback<String> callback) throws AwesomeException;
}
Сейчас, прямо сейчас, это работает. На стороне клиента я просто делаю что-то вроде этого (getField(String)
- это небольшая настройка, которую я сделал по несвязанным причинам, но она помогает понять смысл)
public void onFailure(Throwable caught) {
if(caught instanceof AwesomeException) {
AwesomeException a = (AwesomeException)caught;
getField(a.getfield()).setErrorText(a.getText());
getField("error-code").setText(a.getCode());
}
}
И да, это работает как ожидалось. Но представьте на мгновение, что user
было null
- некоторые из вас, возможно, читали, что «О, боже, у него может быть NPE, если имя пользователя не существует», и вы абсолютно правы. И, конечно же, я защищаю такие вещи. Однако я не буду ловить все эти обстоятельства. Я хотел бы добавить где-нибудь обработчик исключений, который перехватывает все эти исключения и помещает их в AwesomeException
- в частности, чтобы я мог передать соответствующий код ошибки пользователю, чтобы он мог связаться со службой поддержки по поводу того, что пошло не так. Я не хочу полагаться на то, что программист всегда помнит каждый возможный нулевой и недопустимый аргумент и все другие исключения времени выполнения. Конечно, я не хочу, чтобы они были довольны, но я хочу убедиться, что у пользователя ВСЕГДА есть код ошибки, с которым можно связаться в службу поддержки.
(Код ошибки на самом деле является идентификатором запроса - каждый запрос имеет идентификатор, и все сообщения журнала используют этот идентификатор при печати - поэтому, если они сообщают код ошибки, мы можем очень легко увидеть все сообщения журнала с этим запросом и устранить ошибку.)
Я попытался отследить обратный вызов, но в итоге он теряется в классе RPC. Но, конечно, я не первый, кто пытается перехватить исключения GWT, посылаемые сервером, верно?