1

我试过了

public void onFailure(Throwable caught) {
    Throwable cause = caught.getCause();
    String causeStr = (cause==null) ? "" : ", "+cause.getMessage();
    errorLabel.setText(SERVER_ERROR + ": " + caught.getMessage() + causeStr);

但是 cause 总是 null 并且caught.getMessage()总是等于非常通用的500 The call failed on the server; see server log for details. 我想从服务器抛出 IllegalArgumentExceptions 并能够在客户端上显示它:

throw new IllegalArgumentException("Email address is invalid.");
4

5 回答 5

2

您的异常需要可序列化才能通过电缆。

此外,最佳实践说:您应该有两种异常类型:

  • SystemException:这是一个致命的异常,用户无法恢复(这不应该是可序列化的,因为你会给用户一个类型的反馈“服务器发生错误,请联系管理员”
  • BusinessException:这是由于用户误用了您的信息(例如:UnauthorizedException、BadMailException 或更普遍的 InvalidvalueException)

这样,您将在日志中写入系统异常并将业务异常发送回用户

于 2013-10-12T12:33:21.967 回答
2

您还可以覆盖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>
于 2013-10-11T17:54:38.540 回答
1

您可以使用com.google.gwt.core.client.GWT.UncaughtExceptionHandler在服务器上捕获异常,然后抛出您自己的异常

  1. 工具Serializable,和

  2. 在客户端可访问(并为其编译)的源文件夹中定义。

于 2013-10-11T17:43:51.913 回答
1

我还发现你可以发回一个 Google UmbrellaException,但是你必须把它实例化一点,因为它只在构造函数中使用 Sets:

服务器

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!
于 2013-10-14T16:18:03.410 回答
0

我最喜欢 Zied 和 Fred 的答案,因为它们最简单、最透明。但是,不需要使用 UncaughtExceptionHandler 或创建 SystemExceptions,因此它可以更简单。只需像平常一样捕获异常,重新包装并抛出。无需乱扔服务器接口与异常(只是你的)。任何像 OutOfMemoryError 这样的严重错误都将由 GWT 正常处理。也比我的其他答案更简单的实例化。GWT 已经有通过/失败处理程序,onSuccess/onFailure因此无需onSuccess使用特殊的返回值重新检查失败。但是,唯一的方法onFailure是使用异常,因此即使布尔值可能就足够了,也需要异常来向客户端处理程序指示错误。

我的异常

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");
于 2013-10-14T21:13:08.597 回答