在服务器端,我们有一个 RemoteServiceServlet 的子类,用于所有服务实现。您提到这似乎很耗时,但这就是代码的样子。你做一次就完成了。
@Override
protected void doUnexpectedFailure(Throwable t) {
t.printStackTrace(System.err);
super.doUnexpectedFailure(t);
}
注意:我们实际上并没有将其发送到 System.err,您可能也不应该这样做,但您明白了。
在客户端,我们使用 AsyncCallback 的一个子类,称为 AsyncSuccessCallback。它为我们的大多数 RPC 调用统一处理 onFailure 情况。我们的大多数回调代码都可以处理 onSuccess 的情况,因为知道 onFailure 已被处理。它还提供了一个稍后更改此实现的地方。
public abstract class AsyncSuccessCallback<T> implements AsyncCallback<T> {
public void onFailure(Throwable t) {
handleException(t);
}
protected void handleException(Throwable t) {
Window.alert(t.getMessage());
}
}
注意:我们实际上并不使用 Window.alert,但同样,您明白了。在这种情况下,我们所做的是显示一个 GWT 对话框,该对话框显示一个向接受错误报告的不同服务器执行 POST 的表单。该表单允许用户键入错误发生时他们正在执行的操作的描述。
在客户端,如果要获取堆栈跟踪,则需要编写一些额外的代码:
// for lineEnding, use "<br>" for HTML, "\n" for text
public static final String getStackTrace(Throwable t, String lineEnding) {
Object[] stackTrace = t.getStackTrace();
if (stackTrace != null) {
StringBuilder output = new StringBuilder();
for (Object line : stackTrace) {
output.append(line);
output.append(lineEnding);
}
return output.toString();
} else {
return "[stack unavailable]";
}
}