当前位置: 首页 > 面试题库 >

GWT服务例外记录的最佳做法

滕弘新
2023-03-14
问题内容

我决定将日志记录系统添加到我的gwt服务层。首先,我想记录从该层引发的所有异常。我有一个类似于Spring的ServletDispatcher的对象,该对象调用其他服务。我以为可以在其中添加日志记录,但是我意识到GWT服务将已检查的异常包装在ServletResponse中,并将未检查的包装为UnexpectedException。

有人可以分享他在这个问题上的经验吗?记录所有GWT服务的已检查和未检查的异常的最佳方法是什么。

我找到了建议扩展 RemoteServiceServlet 并覆盖默认异常流的解决方案。但是我发现此解决方案太耗时。有人知道任何更简单的变体吗?


问题答案:

在服务器端,我们有RemoteServiceServlet的子类,可用于所有服务实现。您提到这似乎很耗时,但是代码如下所示。您只需完成一次就可以了。

@Override
protected void doUnexpectedFailure(Throwable t) {
    t.printStackTrace(System.err);
    super.doUnexpectedFailure(t);
}

注意:我们实际上并没有将其发送到System.err,您也可能不应该将其发送给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对话框,该对话框显示一个窗体,该窗体对接收错误报告的其他服务器执行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]";
    }
}


 类似资料:
  • 问题内容: 我正在尝试让Celery日志记录与一起使用Django。我已经登录设置进入控制台(在上托管时效果很好Heroku)。在每个模块的顶部,我有: 在我的task.py中,我有: 这对于记录来自任务的调用非常有效,并且我得到如下输出: 但是,如果那个任务然后在另一个模块中调用一个方法,例如一个方法,我将得到重复的日志条目,例如 我想我可以用 只是使用Django日志记录,但是当我尝试使用它时

  • 问题内容: 多线程Java应用程序中进行进程间通信的最佳方法是什么? 它应该是高性能的(因此请不要使用JMS),易于实现且可靠,以便对象和数据只能绑定到一个线程? 任何想法欢迎! 问题答案: 假设场景1是JVM,那么实际上应该是多个线程,尤其是各种Queue实现,都是java.util.concurrent。但是,在此之上的抽象可能很好,Jetlang看起来非常有趣,轻量级的Java消息传递。

  • 问题内容: 在GWT应用程序中将 大量HTML外部化 的最佳方法是什么?我们有一个相当复杂的GWT应用程序,大约有30个“页面”;每个页面的底部都有一种指南,它是HTML标记的几段。我想外部化HTML,以使其尽可能保持“未转义”状态。 我知道并了解如何在GWT中使用 属性文件 ;这肯定比将内容嵌入Java类更好,但是对于HTML来说仍然很难看(您需要对所有内容都反斜杠,以及转义引号等)。 通常,这

  • 问题内容: 在我一直在构建的应用程序中,我们相当依赖于SharedPreferences,这使我思考了访问SharedPreferences时的最佳实践。例如,许多人说通过此调用可以访问它: 但是,这似乎很危险。如果您有依赖于SharedPreferences的大型应用程序,则可能会有密钥重复,尤其是在使用某些也依赖SharedPreferences的第三方库的情况下。在我看来,更好的使用方法是:

  • 问题内容: 当前,正在讨论具有单个sql连接体系结构的优缺点。 为了详细说明我们正在讨论的是,在应用程序创建时打开一个sql连接,在应用程序关闭或错误关闭该sql连接时。根本不创建另一个连接,而只使用那个与数据库进行通信。 我们想知道社区的想法。 问题答案: 一旦您在不确定的时间内不再需要连接,请立即将其关闭。这样,连接将返回到连接池(如果启用了连接池),并且可以被其他人(重新使用)。 (连接是昂

  • 问题内容: 我有一对多关系的两个数据库表。数据如下所示: 结果集: 我想删除所有应用程序,但最新的除外。换句话说,每个学生都只能将一个应用程序链接到该应用程序。使用上面的示例,数据应如下所示: 我将如何构造我的DELETE语句以过滤出正确的记录? 问题答案: 考虑到评论中的长时间讨论,请注意以下几点: 上面的语句 将 在任何正确实现语句级读取一致性的数据库上运行,而不管语句运行时对表的任何更改。