我试过
public void onFailure(Throwable caught) {
Throwable cause = caught.getCause();
String causeStr = (cause==null) ? "" : ", "+cause.getMessage();
errorLabel.setText(SERVER_ERROR + ": " + caught.getMessage() + causeStr);
但是原因始终为空,caught.getMessage()
总是等于非常通用的500 The call failed on the server; see server log for details
。我想从服务器抛出IllegalArgumentExceptions并能够在客户端上显示它:
throw new IllegalArgumentException("Email address is invalid.");
答案 0 :(得分:2)
您的例外情况需要可序列化才能通过电缆传输。
此外,最佳做法是:您应该有两种例外情况:
这样,您将在日志中编写系统例外,并将业务例外发回给用户
答案 1 :(得分:1)
您可以使用com.google.gwt.core.client.GWT.UncaughtExceptionHandler
来捕获服务器上的异常,然后抛出您自己的异常
实施Serializable
和
在客户端可访问(和编译)的源文件夹中定义。
答案 2 :(得分:1)
您还可以覆盖RequestFactoryServlet
并将其传递给自定义异常处理程序::
public class CustomRequestFactoryServlet extends RequestFactoryServlet {
private static class ApplicationExceptionLogger implements ExceptionHandler {
private final Logger log = LoggerFactory.getLogger(ApplicationExceptionLogger.class);
@Override
public ServerFailure createServerFailure(Throwable throwable) {
log.error("Server Error", throwable);
return new ServerFailure(throwable.getMessage(), throwable.getClass().getName(), throwable.getStackTrace().toString(), true);
}
}
public CustomRequestFactoryServlet() {
super(new ApplicationExceptionLogger());
}
}
在web.xml ::
中<servlet>
<servlet-name>requestFactoryServlet</servlet-name>
<servlet-class>com.myvdm.server.CustomRequestFactoryServlet</servlet-class>
</servlet>
答案 3 :(得分:1)
我还发现你可以发回一个Google UmbrellaException,但你必须实例化它有点搞笑,因为它只需要构造函数中的Set:
public String getUserId () throws Exception {
Set<Throwable> s = new HashSet<Throwable>(Arrays.asList(new IllegalArgumentException("Hidey hidey ho!")));
if (true) throw new com.google.gwt.event.shared.UmbrellaException(s);
public void onFailure(Throwable caught) {
log.severe("fetchUserName(), Could not fetch username: " + caught.getMessage());
Mon Oct 14 12:05:28 EDT 2013 com.example.client.Login
SEVERE: fetchUserName(), Could not fetch username: Exception caught: Hidey hidey ho!
答案 4 :(得分:0)
我最喜欢Zied和Fred的答案,因为它们是最简单,最透明的。但是,不需要使用UncaughtExceptionHandler或创建SystemExceptions,因此它可以更简单。只需捕获正常的异常,重新包装和抛出。无需在服务器接口上乱丢异常(只有你自己)。像OutOfMemoryError这样的严重错误将由GWT正常处理。实例化也比我的其他答案更简单。 GWT已经有onSuccess/onFailure
的通过/失败处理程序,因此无需使用特殊返回值重新检查onSuccess
内的失败。但是,到达onFailure
的唯一方法是使用Exception,因此即使布尔值可能已足够,也需要Exception来向客户端处理程序指示错误。
package com.example.shared;
import java.io.Serializable;
public class MyException extends Exception implements Serializable {
private static final long serialVersionUID = 1104312904865934899L;
public MyException() {}
public MyException (String s) {
super(s);
}
}
public void cancelSend() throws MyException {
throw new MyException("Because I said so");