如何使用GWT获取服务器端异常消息?

时间:2013-10-11 17:32:20

标签: java gwt

我试过

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.");

5 个答案:

答案 0 :(得分:2)

您的例外情况需要可序列化才能通过电缆传输。

此外,最佳做法是:您应该有两种例外情况:

  • SystemException:这是一个致命的异常,用户无法恢复(这不应该是可序列化的,因为您将向用户提供类型的反馈“服务器上发生错误,请联系管理员”
  • BusinessException:这是由于用户滥用您的ammplication(例如:UnauthorizedException,BadMailException或更常见的InvalidvalueException)

这样,您将在日志中编写系统例外,并将业务例外发回给用户

答案 1 :(得分:1)

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

  1. 实施Serializable

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

答案 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来向客户端处理程序指示错误。

MyException

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");