javascript – 在Node.js中暴露和编写错误的最佳方法是什么?

前端之家收集整理的这篇文章主要介绍了javascript – 在Node.js中暴露和编写错误的最佳方法是什么?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在编写一个与REST API对话的模块,并且由于REST API提供了良好的语义错误响应(例如403与503),我想将这些语义错误传达给调用者.

(编辑:我的意思是,调用者应该能够以编程方式理解错误的原因并采取相应的行动,例如显示适当的UI.)

对我来说最好的方法是什么?

>为这些语义创建我自己的Error子类,例如: mymodule.ForbiddenError,mymodule.ServiceUnavailableError?然后,调用者将检查instanceof以获取语义.这在静态类型语言(如C#和Java)中最为常见.
>添加例如标准错误实例的mymoduleCode属性,带有“Forbidden”或“ServiceUnavailable”等语义字符串. Node.js本身就是这样做的,例如代码:’ECONNREFUSED’.
>其他一些方式?

==

我现在正在编写另一个模块,它包装了第一个模块.我不想直接公开内部模块的错误,但为了可调试性,编写/包装它们会很好.

对我来说,最好的方法是什么呢?

>添加例如我的Error实例的internalError属性,它引用内部模块的Error实例. C#和Java再次这样做. (Exception#InnerException/Throwable#cause)
>其他一些方式?

但是,我见过的大多数工具只显示Error实例的堆栈属性,因此在这些情况下这些数据会丢失.是否存在已经存在的典型/传统方式?

解决方法

您描述的用例是Node现在无法满足的用例.由于使用的惯例,它们往往是以下的混合物:

>创建简单派生自Error构造函数的新错误类型.主要用于创建高级错误类别.您可以使用instanceof来区分错误类型,但感觉不是非常JavaScripty.
>创建Java样式的Error子类型,将另一个错误作为构造函数参数,然后将其包装起来.如果您使子类型公开API,那么您基本上使用多态而不是直接分派来根据类型处理错误.
>通过Error构造函数创建语义上有用的错误消息.这是我倾向于使用很多的模式.
>将属性附加到错误,这也是非常常见的.
>创建一个解耦的错误处理API,可以从错误发生的任何地方调用它.这为您提供了一个集中所有代码的地方,这些代码可以确定您遇到的错误类型以及应该如何处理错误,并注入处理错误所需的任何依赖项.

这里真正的问题是这些都是临时机制,我不会说它们中的任何一个已达到临界质量.我认为这部分是由于异步性和JavaScript的结合使得很难正确并完全处理错误,因此建议通常在捕获有关错误的信息后关闭整个过程.

这并不能很好地处理预期的错误,但我认为大多数错误都是由框架捕获的(例如Express错误处理程序)或者放入Node回调约定.简而言之,我认为这里有空间来定义一些惯例,因为最先进的技术并不是那么巧妙.

猜你在找的JavaScript相关文章