(编辑:我的意思是,调用者应该能够以编程方式理解错误的原因并采取相应的行动,例如显示适当的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实例的堆栈属性,因此在这些情况下这些数据会丢失.是否存在已经存在的典型/传统方式?
解决方法
>创建简单派生自Error构造函数的新错误类型.主要用于创建高级错误类别.您可以使用instanceof来区分错误类型,但感觉不是非常JavaScripty.
>创建Java样式的Error子类型,将另一个错误作为构造函数参数,然后将其包装起来.如果您使子类型公开API,那么您基本上使用多态而不是直接分派来根据类型处理错误.
>通过Error构造函数创建语义上有用的错误消息.这是我倾向于使用很多的模式.
>将属性附加到错误,这也是非常常见的.
>创建一个解耦的错误处理API,可以从错误发生的任何地方调用它.这为您提供了一个集中所有代码的地方,这些代码可以确定您遇到的错误类型以及应该如何处理错误,并注入处理错误所需的任何依赖项.
这里真正的问题是这些都是临时机制,我不会说它们中的任何一个已达到临界质量.我认为这部分是由于异步性和JavaScript的结合使得很难正确并完全处理错误,因此建议通常在捕获有关错误的信息后关闭整个过程.
这并不能很好地处理预期的错误,但我认为大多数错误都是由框架捕获的(例如Express错误处理程序)或者放入Node回调约定.简而言之,我认为这里有空间来定义一些惯例,因为最先进的技术并不是那么巧妙.