Должен ли я полностью исключить try/catch из кода, в котором я использую обещания (Bluebird)?

У меня есть пара очень простых шагов по настройке, прежде чем я вызову свои обещанные функции, и я собираюсь обернуть их в блок try / catch, потому что это кажется самым простым способом. Тем не менее, это кажется немного грязным для меня.

Должен ли я вместо этого создать функцию, которая возвращает обещание, даже если это очень просто? Вот пример.

try
  thingyId = req.params.id # here I am 99.999% sure that params is defined,
  # but if for some bizarre reason it's not, I'd like to handle that error
  # instead of breaking the whole program
catch
  console.log "error: " + e

# do normal promisified functions

или я должен написать это как

setThingyId = (req) ->
  return new Promise (resolve, reject) !->
    if req.hasOwnProperty "params"
      resolve req.params.id
    else
      reject new Error "no params"

setThingyId(req)
  .then (deviceId) ->
    # other promisified functions

1 ответ

Решение

Ну, это на самом деле хороший вопрос.

  • Если функция синхронная - НЕ возвращайте обещание и НЕ используйте в нем bluebird. Это медленнее, чем синхронное выполнение и сложнее для отладки. Использование try / catch для синхронного кода очень уместно. Вы могли бы вместо этого, конечно, выполнить "params" in req в if вместо того, чтобы использовать исключения вообще, что, вероятно, более уместно.

  • Если функция выполняет свою задачу асинхронно и возвращает обещание, вы можете использовать Promise.method чтобы сделать его безопасным.

Так что в вашем случае я бы сделал:

setThingyId = (req) ->
    if req && req.params && req.params.id
       someCalculationOverReqId req.params.id
    else 
       handleExceptionalCase req

Вот способ Promise.method:

setThingyId = Promise.method (req) ->
    someCalculationOverReqId req.params.id

Обратите внимание, что это имеет смысл только в том случае, если функция возвращает обещание, что она будет делать, превращая любые броски в отклонения, эффективно делая функцию безопасным.

Другие вопросы по тегам