我应该在使用(Bluebird)承诺的代码中完全消除try/catch吗?
Should I completely eliminate try/catch from code where I use (Bluebird) promises?
在调用我承诺的函数之前,我有几个非常基本的设置步骤,我正在考虑将它们包装在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
这个问题问得好。
-
如果一个函数是同步的,不要返回promise,也不要在其中使用bluebird。它比同步执行慢,而且更难调试。对同步代码使用try/catch是非常合适的。当然,您可以在
if
中执行"params" in req
,而不是使用异常,这可能更合适。 -
如果一个函数以异步方式完成它的任务并返回一个promise,你可以使用
Promise.method
使它成为throw安全的
所以在你的例子中,我会写:
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
请注意,这只有在函数返回promise时才有意义,这样做的目的是将任何抛出转换为拒绝,从而有效地使函数抛出安全。
相关文章:
- errors with Javascript try catch
- JSON.parse,已经在try/catch块中,仍然抛出语法错误
- 在try-catch块内的HTML文件中导入JavaScript文件
- 有没有一种方法可以将try-catch添加到Javascript中的每个函数中
- Javascript Try Catch for DIV
- Safari 在尝试使用 Javascript try/catch 访问父窗口对象时未捕获异常
- 与在异步回调链中使用 try catch 块相比,返回异常有什么优势
- 在 Javascript 中,即使从未抛出异常,使用 try-catch 块是否昂贵
- JavaScript 中的 try-catch:如何获取原始错误的堆栈跟踪或行号
- 使用 try catch(e) 进行浏览器功能检测
- 了解 JavaScript 中的异常处理:当更改 try/catch 块的位置时,获得不同的输出
- 在 JavaScript 中用“try catch”包装每个方法的性能问题
- execScript try/catch in IE 8 中的怪异之处
- Javascript代码仅在FireFox中的try-catch块中失败
- 在 AJAX 响应中查找嵌套属性,这是 try/catch 的情况
- 使用 window.onerror 和 try-catch 块处理错误之间的差异
- 在声明变量时使用 try catch
- Array.map+try/catch传递了引用赋值延迟
- 在PHP中使用Try-catch结构
- 如何停止javascript中嵌套try/catch错误的传播