【问题标题】:Vaadin 10+: How do I handle uncaught exceptions?Vaadin 10+:如何处理未捕获的异常?
【发布时间】:2019-04-22 07:38:17
【问题描述】:

在 Vaadin 8 中:

UI.getCurrent().setErrorHandler(e -> handleError(e));

setErrorHandler在 Vaadin 11 中不存在,我找不到对应的方法或文档。

【问题讨论】:

    标签: vaadin vaadin10


    【解决方案1】:

    在 Vaadin 10+ 中有两个错误处理入口点:

    • 路由异常处理,在构建视图时在导航阶段触发,并且
    • Session 的 ErrorHandler,在视图渲染后触发。

    前一种是在服务器因为异常而无法生成视图时触发的。后者由来自按钮单击、其他类型的组件事件和 UI.access() 的异常触发。

    更多详情请查看https://mvysny.github.io/vaadin-error-handling/

    【讨论】:

      【解决方案2】:

      如果你使用 Vaadin Spring Boot starter 实现应该是这样的:

      @SpringComponent
      public class MyVaadinServiceInitListener implements VaadinServiceInitListener {
      
          @Override
          public void serviceInit(ServiceInitEvent event) {
              event.getSource().addSessionInitListener(e -> {
                  e.getSession().setErrorHandler(errorEvent-> {
                      Throwable t = errorEvent.getThrowable();
                      // handle error
                  });
              });
          }
      }
      

      【讨论】:

      • 我试过这种方式,但对我来说它没有发现错误。您能否提供有关此替代方案的更多详细信息?
      • 这在 Vaadin Flow 中不再可能。
      【解决方案3】:

      有 VaadinSession::setErrorHandler 用于不是关于在路由/导航期间发生的错误,而是例如在单击时发生的错误。

      【讨论】:

      【解决方案4】:

      在 Flow (Vaadin 10+) 中,有一种机制可以捕获路由器中未捕获的异常。因此,您可以创建错误视图,这些视图在捕获定义的异常时显示。它们是通过实现带有异常类型的 HasErrorParameter 接口创建的。以下是 Vaadin 文档中的一个示例:

      @Tag(Tag.DIV)
      public class RouteNotFoundError extends Component
              implements HasErrorParameter<NotFoundException> {
      
          @Override
          public int setErrorParameter(BeforeEnterEvent event,
                  ErrorParameter<NotFoundException> parameter) {
              getElement().setText("Could not navigate to '"
                          + event.getLocation().getPath() + "'");
              return HttpServletResponse.SC_NOT_FOUND;
          }
      }
      

      我建议从文档中阅读更多内容。

      https://vaadin.com/docs/v11/flow/routing/tutorial-routing-exception-handling.html

      【讨论】:

      • 谢谢。我在 Vaadin 8 中实现了一个自定义导航方案,所以我没有在 Vaadin 11 中使用 Router,而是使用 VaadinServlet 和 UI。仍在寻找一种在发生异常时向用户显示消息的方法。
      • Reto,你有解决办法吗?
      猜你喜欢
      • 1970-01-01
      • 2015-09-10
      • 2011-10-27
      • 2017-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-19
      • 1970-01-01
      相关资源
      最近更新 更多