我正在尝试创建一个Discord机器人,直接记录到它所在的Discord服务器,但是discordrb gem本身拒绝让我自救这个块。
ngOnInit() {
this.likedProp = this._property.getAllUserLikedProperties();
}
结果如下:
begin
require 'discordrb'
phoenix = Discordrb::Bot.new token: 'TOKEN'
crashpass = rand(0..9999999)
puts "Crash password: #{crashpass}" #Prints to the terminal screen, not to the server
phoenix.message(with_text: "CP!crash #{crashpass}") do
raise "Admin initiated crash."
end
rescue Exception #I know, bad practice, but I wish for this to always execute on error.
ensure
phoenix.run :async #allows code to keep running after bot initialization
phoenix.dnd
phoenix.send_message(454137675944034314, "Something terrible has happened, and I can't recover!\n#{e}")
phoenix.send_message(454137675944034314, "Currently running in emergency mode!")
phoenix.sync
end
机器人不会停止或向服务器报告错误,忽略整个救援,包括确保(我相信至少可以保证开始运行)。
有没有办法强制脚本给我们错误处理,而不是内置的宝石?
答案 0 :(得分:1)
它只会阻止您在phoenix
内拯救例外。
require 'discordrb'
phoenix = Discordrb::Bot.new token: 'TOKEN'
phoenix.run :async
begin
raise "Error here!"
rescue Exception
puts "Got exception!"
end
这样的事情会很好,但是当你做的事情是这样的时候:
phoenix.message(with_text: "CP!crash #{crashpass}") do
raise "Admin initiated crash."
end
异常将在异步运行的phoenix
DiscorrRb::Bot
实例中引发,该实例具有自己的错误处理功能,因此在后台运行时引发的异常(例如在发生任何连接错误后重新连接)将会得到处理,而不是崩溃应用程序的其余部分。
如果要将异常消息发送到discord,则需要修改Discordrb::Logger
。但是,我不认为它非常有用,因为在Discordrb::Bot
异步代码中引发的异常很可能与连接已停止工作并且无法发送的情况相关。异常消息到discord,导致无限循环/堆栈溢出,其中异常消息发送到discord会导致异常,因为discord连接已断开连接。
但是,如果您希望代码中存在任何异常(而不是Discordrb::Bot
的代码),那么就没有什么能阻止您编写类似的内容:
phoenix.run :async
loop do
begin
score = calculate_score
phoenix.send_message(channel_id, "Score : #{score}")
rescue => ex
phoenix.send_message(
channel_id,
"crash while calulcating score! #{ex.class} : #{ex.message}"
)
sleep 10
retry
end
sleep 10
end
如果你想在事件处理程序中进行救援:
phoenix.message(with_text: "score?") do |event|
begin
score = ScoreCalc.calculate_score
event.respond("Score : #{score}")
rescue => ex
send_message(454137675944034314, "CRASHED! #{ex.class}: #{ex.message}")
send_message(454137675944034314, ex.backtrace.join("\n"))
event.respond "Sorry, there was a problem and it has been reported"
end
end
线程/异步代码中的异常处理是Ruby中的常见问题。