Это только помешает вам спасать исключения внутри 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
, который имеет свою собственную обработку ошибок, так что исключения, возникающие при работе в фоновом режиме, такие как переподключение после любых ошибок подключения, будут обрабатываться вместосбой остальной части приложения.
Если вы хотите отправить сообщения об исключениях на дискорд, вам нужно будет изменить Discordrb::Logger
.Однако я не думаю, что это очень полезно, так как, скорее всего, исключения, возникшие внутри асинхронного кода Discordrb::Bot
, будут связаны с ситуацией, когда соединение перестало работать, и оно не сможет отправить сообщение об исключении.к разногласиям, вызывая бесконечное переполнение цикла / стека, когда отправка сообщения об исключении для разногласий вызывает исключение, потому что разорванное соединение разорвано.
Если, однако, вы хотите какие-либо исключения в вашем коде (не Discordrb::Bot
's код) ничто не мешает вам написать что-то вроде:
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.