当 ClientEmitter 出错时运行函数

Posted

技术标签:

【中文标题】当 ClientEmitter 出错时运行函数【英文标题】:Run a function when a ClientEmitter has an error 【发布时间】:2020-02-28 13:08:41 【问题描述】:

我正在使用一个事件处理程序,其中每个事件代码都在它自己的文件中。我将事件附加到客户端,因此当该文件发出事件时,它将运行该代码:

// looping through all event files
client.on(file.split('.')[0], require(`events/$file`).bind(null, client, Util);

如果事件文件是message.js,则类似于:

client.on('message', require('events/message.js').bind(null, client, Util);

所以当message 事件发出时,它会运行message.js 文件,传递clientUtil 类。

我还有一个附加到client 的函数,称为report。它基本上会在出现错误时报告。我想要它,所以每当来自客户端的任何事件出现错误时,它都会运行该函数。 我已经使用以下命令稍微完成了此操作:command.run(...).catch(error => client.report(error)). 有没有类似的方法可以做到这一点,而不必在所有事件文件中的所有代码周围放置一个 try-catch?

【问题讨论】:

您在寻找client.on('error', (error) => client.report(error));吗? 【参考方案1】:

错误处理应该是上下文驱动的。这意味着你的机器人对错误的响应应该取决于它在做什么、在什么渠道等——既用于调试,也用于最终用户关于发生了什么的信息。如果让错误一直传播到未捕获的异常,您将错过所有上下文,并且无法创建错误消息,用户只会看到机器人没有响应并认为它已关闭或命令坏了。

我的建议:为最常见的错误生成函数创建辅助方法,用错误处理包装它们。我这样做主要是为了发送消息,因为有很多事情可能会导致消息发送失败,超出您的控制范围,并且处理包括生成错误消息并尝试在频道中发送或将其发送给用户,如果失败了。

【讨论】:

【参考方案2】:

试试这个方法

client.on('error', require('events/report.js').bind(null, client, Util);

【讨论】:

以上是关于当 ClientEmitter 出错时运行函数的主要内容,如果未能解决你的问题,请参考以下文章

执行cl.exe出错

用VC编程出现好多错误,说是执行CL.EXE时出错

Python 模块 Cupy 函数在使用 cupy.einsum() 时出错

使用 cl 编译的代码在第一次运行时挂起太久[关闭]

部署到 Elastic Beanstalk 时出错:chown /var/app/staging/bin/python:没有这样的文件或目录

在 Laravel 8 中运行多个 PHPUnit 测试时出错