Try/Catch не предотвращает сбой

Я пишу очень простой телеграмм-бот, используя телеграфный бот-фреймворк. Пока он отвечает на некоторые простые команды, используя методы .hears и .on, пока все работает нормально.

Теперь я реализовал другой метод .hears, который ожидает строку Miez. Как только он «услышат» эту строку, он должен .replyWithDocument содержать URL cat-api. URL-адрес в соответствии с cat-api предоставляет случайный cat-gif при каждом вызове. Пока мой код:

const Telegraf = require('telegraf')

const app = new Telegraf('<MY_TOKEN>')

// Connect/Express.js integration
const express = require('express')
const expressApp = express()

expressApp.set('port', (process.env.PORT || 5000));


app.command('start', (ctx) => {
  console.log('start', ctx.from)
  ctx.reply('Welcome!')
})

app.hears('Hi', (ctx) => ctx.reply('Hallo!'))
app.hears('Marco', (ctx) => ctx.reply('Polo'))
app.on('sticker', (ctx) => ctx.reply('❤'))

app.hears('Miez',(ctx) => {
    try{
          return ctx.replyWithDocument({
            url: 'http://thecatapi.com/api/images/get?format=src&type=gif',
            filename: 'cat.gif'
          })

       }catch(error){
            return ctx.reply("Miau");
       }
})

Итак, как видите, я обернул .replyWithDocument в блок try/catch. Я сделал это, потому что данный url не всегда предоставляет GIF. Иногда вы просто получаете сообщение Server not found. Я размещаю бота на Heroku, и вот журналы соответствующей ошибки:

Failed to process updates. { FetchError: request to http://30.media.tumblr.com/tumblr_lu65p0QXgW1r4xjo2o1_r1_500.gif failed, reason: getaddrinfo ENOTFOUND 30.media.tumblr.com 30.media.tumblr.com:80
    at ClientRequest.<anonymous> (/app/node_modules/telegraf/node_modules/node-fetch/index.js:133:11)
    at emitOne (events.js:96:13)
    at ClientRequest.emit (events.js:188:7)
    at Socket.socketErrorListener (_http_client.js:310:9)
    at emitOne (events.js:96:13)
    at Socket.emit (events.js:188:7)
    at connectErrorNT (net.js:1022:8)
    at _combinedTickCallback (internal/process/next_tick.js:74:11)
    at process._tickCallback (internal/process/next_tick.js:98:9)
  message: 'request to http://30.media.tumblr.com/tumblr_lu65p0QXgW1r4xjo2o1_r1_500.gif failed, reason: getaddrinfo ENOTFOUND 30.media.tumblr.com 30.media.tumblr.com:80',
  name: 'FetchError',
  errno: 'ENOTFOUND',
  type: 'system',
  code: 'ENOTFOUND' }

После этого бот перестает работать на Heroku на некоторое время, а затем снова возвращается через 15 минут или около того, я думаю, он перезапускается после некоторого времени бездействия.

Ну, в конце концов, я не возражаю против того, чтобы URL-вызов иногда терпел неудачу. Чего я не понимаю, так это почему мой блок try/catch не улавливает такое поведение. В случае, если моя интерпретация журналов верна.

Редактировать: Мне пришла в голову возможная причина, возможно, .replyWithDocument — это асинхронный вызов. Так что HTTP-запрос успешен и попытка тоже. Но как только ответ будет Server not found, вызов метода по-прежнему терпит неудачу. Если это может быть причиной, как с этим справиться?


person チーズパン    schedule 03.01.2017    source источник
comment
Если answerWithDocument основан на обещаниях, используйте .catch(). Если он основан на обратном вызове, обработайте параметр ошибки в обратном вызове.   -  person Andy Ray    schedule 03.01.2017


Ответы (1)


Вам нужно использовать собственные методы обработки ошибок Telegraf!.

По умолчанию Telegraf печатает все ошибки в stderr и повторяет ошибку. Чтобы выполнить пользовательскую логику обработки ошибок, используйте следующий фрагмент:

const app = new Telegraf(process.env.BOT_TOKEN)
app.catch((err) => {
  console.log('Ooops', err)
})

Попробуйте использовать приведенный выше код, чтобы отловить ошибку «ENOTFOUND».

Источник: http://telegraf.js.org/introduction.html#error-handling< /а>

person Leonel Atencio    schedule 03.01.2017