Должен ли я полностью исключить 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
Обратите внимание, что это имеет смысл только в том случае, если функция возвращает обещание, что она будет делать, превращая любые броски в отклонения, эффективно делая функцию безопасным.