在服务器端,我们有一个RemoteServiceServlet的子类,用于所有服务实现。你提到这似乎很耗时,但以下是代码示例。只需要做一次即可完成。
@Override
protected void doUnexpectedFailure(Throwable t) {
t.printStackTrace(System.err);
super.doUnexpectedFailure(t);
}
注意:我们实际上不会将它发送到System.err,而且您也可能不应该这样做,但您可以得到这个想法。
在客户端,我们使用AsyncCallback的子类AsyncSuccessCallback。它统一处理了大部分RPC调用的onFailure情况。大多数回调代码都可以通过了解已处理onFailure来处理onSuccess。它还提供了一个单一的地方来稍后更改此实现。
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 DialogBox,其中包含一个表单,该表单会向另一台接受错误报告的服务器进行POST提交。该表单允许用户输入错误发生时他们正在进行的操作的描述。
如果你想要获取堆栈跟踪信息,需要在客户端编写一些额外的代码:
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]";
}
}