Ase*_*ore 6 javascript error-handling node.js
我正在编写一个与REST API对话的模块,并且由于REST API提供了良好的语义错误响应(例如403与503),我想将这些语义错误传达给调用者.
(编辑:我的意思是,调用者应该能够以编程方式理解错误的原因并采取相应的行动,例如显示相应的UI.)
对我来说最好的方法是什么?
创建我自己的Error那些语义,子类例如mymodule.ForbiddenError,mymodule.ServiceUnavailableError?然后,调用者将检查instanceof以获得语义.这在静态类型语言(如C#和Java)中最为常见.
将mymoduleCode属性添加到标准Error实例,使用'Forbidden'或等语义字符串'ServiceUnavailable'.Node.js本身就是这样做的,例如code: 'ECONNREFUSED'.
还有其他方法吗?
==
我现在正在编写另一个模块,它包装了第一个模块.我不想直接公开内部模块的错误,但为了可调试性,编写/包装它们会很好.
对我来说,最好的方法是什么呢?
将一个internalError属性添加到Error引用内部模块Error实例的实例中.C#和Java再次这样做.(Exception#InnerException/Throwable#cause)
还有其他方法吗?
但是,我见过的大多数工具只显示实例的stack属性Error,因此在这些情况下这些数据会丢失.是否存在已经存在的典型/传统方式?
您描述的用例是Node现在无法满足的用例.由于使用的惯例,它们往往是以下的混合物:
instanceof错误类型之间discriminiate,但并不觉得很JavaScripty.这里真正的问题是这些都是临时机制,我不会说它们中的任何一个已达到临界质量.我认为这部分是由于异步性和JavaScript的结合使得很难正确并完全处理错误,因此建议通常在捕获有关错误的信息后关闭整个过程.
这并不能很好地处理预期的错误,但我认为大多数错误都是由框架捕获的(例如Express错误处理程序)或者放入Node回调约定.简而言之,我认为这里有空间来定义一些惯例,因为最先进的技术并不是那么巧妙.
发现这篇很棒的文章谈到这个:
http://www.joyent.com/developers/node/design/errors
这里粘贴太多,但在"具体建议"下,第2至5项解决了这个问题:
- 清楚你的功能是做什么的.
Error对所有错误使用对象(或子类),并实现Error合同.- 使用Error的
name属性以编程方式区分错误.Error使用解释详细信息的属性扩充对象- 如果将较低级别的错误传递给调用者,请考虑将其包装.
特别是,该文章链接到此模块以包装/撰写错误:
https://github.com/joyent/node-verror
我不确定我是否必须遵循这些确切的约定 - 例如,我看到了具有应用程序域code属性的价值 - 但原则非常有用.
| 归档时间: |
|
| 查看次数: |
1542 次 |
| 最近记录: |