在使用beta版Phoenix LiveView库时,我玩得很开心。我感到困惑的一件事是如何确保发生异常时,我的LiveViews以可预测和透明的方式运行。
在传统的基于HTTP请求的世界中,我希望该特定请求崩溃,返回500响应以及可能向用户指示“嘿,服务器有问题”的错误页面。开发人员可以依靠诸如Rollbax这样的集成来检测和报告异常,因此我收到了有关该错误的电子邮件,并可以在Rollbar仪表板中对其进行检查。
但是当我的LiveView代码崩溃时,我没有得到保证。 LiveView进程将从崩溃中恢复,并且(据我所知)恢复到其上一个已知的正常状态,这确实很酷,但也会引起用户的沮丧(例如,“每次我提交表单时,都会向我显示一个加载图标,然后还原为空白表格”)。而且我不清楚如何在LiveView中检测或捕获异常,以便可以将异常报告给Rollbar之类的错误监视服务。 (简短的不切实际的解决方案,例如向每个处理程序添加rescue
)
我如何检测LiveView中发生的异常,以便a)以某种方式提醒最终用户该问题,以及b)确保将该异常报告给开发人员?
答案 0 :(得分:2)
但是当我的LiveView代码崩溃时,我没有得到保证。 LiveView进程将从崩溃中恢复,并且(据我所知)将恢复为最后一次已知的健康状态
LiveView处理恢复的方法是让客户积极启动新的LiveView进程。因此,在出现错误的情况下,当前的LiveView进程实际上将崩溃,这将向Elixir的Logger发送一条消息,该消息很可能被Rollbax拦截(我认为它已集成Logger)。因此,在处理错误时一切都应该正常工作。
我如何检测LiveView中发生的异常,以便a)以某种方式提醒最终用户该问题,以及b)确保将该异常报告给开发人员?
计划是,连接的挂载上的错误将刷新页面,从而迫使请求通过常规的HTTP连接的请求,然后该请求将像在LiveView外部一样发出。任何其他处理程序上的错误都将导致重新连接,然后重新连接,这将触发连接的挂载(然后可能还会失败并回退到HTTP)。但是在所有这些情况下,都有一个过程,因此错误应该到达Rollbax。
答案 1 :(得分:1)
一个人可能会覆盖mount/2
回调。来自Phoenix LiveView文档:
如果在有状态生命周期的任何时候遇到崩溃,或者客户端连接断开,则客户端会正常重新连接到服务器,并将其签名的会话传递回
mount/2
。
https://github.com/phoenixframework/phoenix_live_view/blob/master/lib/phoenix_live_view.ex#L150-L153
也就是说,如果您由于某种原因希望LiveView进程成为僵尸,则可能会。 G。维护连接的套接字列表以及时间戳,并在重新连接发生意外时发出警报。