3

我在仍然处于测试阶段的Phoenix LiveView库中玩得很开心。我感到困惑的一件事是如何确保我的 LiveView 在发生异常时以可预测和透明的方式运行。

在传统的基于 HTTP 请求的世界中,我希望该特定请求会崩溃,返回 500 响应以及可能向用户指示“嘿,服务器出现问题”的错误页面。开发人员可以依靠集成,例如Rollbax检测和报告异常,因此我会收到一封有关错误的电子邮件,并且可以在 Rollbar 仪表板中检查它。

但是当我的 LiveView 代码崩溃时,我无法得到这种保证。LiveView 进程将从崩溃中恢复并(据我了解)恢复到其最后一个已知的健康状态,这真的很酷,但也会让用户感到沮丧(例如,“每次我提交表单时,它都会向我显示一个加载图标恢复为空白表格”)。而且我不清楚如何在 LiveView 中检测或捕获异常,以便将它们报告给像 Rollbar 这样的错误监控服务。(缺少不切实际的解决方案,例如向rescue每个处理程序添加一个)

如何检测 LiveView 中发生的异常,以便 a) 以某种方式提醒最终用户该问题,以及 b) 确保将异常报告给开发人员?

4

2 回答 2

3

但是当我的 LiveView 代码崩溃时,我无法得到这种保证。LiveView 进程将从崩溃中恢复并(据我了解)恢复到其最后一个已知的健康状态

LiveView 处理恢复的方式是让客户端启动一个新的 LiveView 进程。所以万一出现错误,当前的 LiveView 进程实际上会崩溃,这会向 Elixir 的 Logger 发送消息,这很可能被 Rollbax 拦截(我假设它具有 Logger 集成)。因此,当涉及到错误处理时,一切都应该正常工作。

如何检测 LiveView 中发生的异常,以便 a) 以某种方式提醒最终用户该问题,以及 b) 确保将异常报告给开发人员?

计划是连接安装上的错误将刷新页面,强制请求通过常规的 HTTP 连接请求,然后会像在 LiveView 之外那样引发。任何其他处理程序上的错误将导致重新连接,然后将触发连接的挂载(然后也可能失败并回退到 HTTP)。但在所有这些情况下,都有一个过程,因此错误应该到达 Rollbax。

于 2019-06-25T06:23:40.843 回答
2

一个人可能会覆盖mount/2回调。来自 Phoenix LiveView 文档:

如果在有状态生命周期的任何时候遇到崩溃,或者客户端连接断开,客户端会优雅地重新连接到服务器,将其签名会话传递回mount/2.
https://github.com/phoenixframework/phoenix_live_view/blob/master/lib/phoenix_live_view.ex#L150-L153

也就是说,如果您希望 LiveView 进程由于某种原因变成僵尸,您可能会 e. G。如果重新连接以意外的方式发生,则维护已连接套接字的列表以及时间戳和警报。

于 2019-06-25T04:55:23.393 回答