在nodeJS中抛出exception与错误对象

我正在尝试在nodeJS中实现一个实用程序库,我可以在不同的项目中使用它。 我坚持如何正确处理错误。
例如,假设我有一个function

function dateCompare(date1,operator,date2) // it can take either a date object or valid date string. 

现在假设提供了一个无效的input –
1.我可以返回错误的结果像asynchronous逻辑 – {错误:真,结果:“”},但这阻止我使用我的function, if((date1,'eq',date2) || (date3,'l3',date4)

2.如果我在这里抛出自定义exception,那么恐怕节点是单线程的,创build错误上下文非常昂贵。

我们如何处理它,使其易于使用,而不是很昂贵?

在哪些情况下,即使太贵,抛出exception也会更合适? 一些实际的用例将会非常有帮助。

对于这样的问题没有“正确的”答案。 有各种不同的哲学,你必须决定哪一个最适合你或你的情况。

这是我的总体scheme:

如果你发现一个严重的编程错误,比如一个函数所需的参数缺失或者是错误的types,那么我宁愿抛出一个exception,然后在msg的exception中拼写出错。 开发人员第一次看到这个代码运行,他们应该知道他们需要立即纠正他们的代码。 这里的一般想法是,你希望开发人员立即看到他们的错误,抛出exception通常是最快的方法,你可以把一个有用的消息放入exception。

如果有预期的错误返回值(如“用户名已被占用”或“用户名包含无效字符”)不是编程错误,而只是给定操作(可能包含用户数据)的原因未完成的指示,则我会从传递这个信息给调用者的函数中创build返回值。

如果你的函数需要返回一个结果或一个错误,那么你必须根据具体情况来决定是否容易得出一系列易于检测的错误值,这些错误值与成功的返回值是分开的。 例如, Array.prototype.indexOf()返回一个负值,表示未find该值,或者返回一个正值,表示正在返回一个索引。 这些范围是完全独立的,所以他们很容易编写testing来区分它们。

抛出一个exception的另一个原因是你的代码很可能被用在让exception传播到多个调用级别或块级别而不是手动编写代码来传播错误的情况下。 这是一把双刃剑。 虽然有时让exception传播是非常有用的,但有时候你实际上需要知道和处理每个级别的exception,以便在错误情况下正确清理(释放资源等),所以你不能让无论如何它会自动boost。

如果这样的区分不是简单的做你的代码的function或开发人员将调用它,那么有时是有意义的返回一个以上属性的对象,其中之一是一个错误属性,另一个这是一个价值。

在你的具体情况下:

 function dateCompare(date1,operator,date2) 

 if (dateCompare(date1,'eq',date2) || dateCompare(date3,'l3',date4)) 

如果函数只是返回一个布尔值,并且抛出date值或运算符无效的exception,那肯定会很方便。 这是否是好的devise决定取决于如何使用这一点。 如果你处在一个紧密的循环中,在很多值上运行它,其中很多将被格式化很糟糕,并且会抛出这样的exception,并且在这种情况下性能很重要,那么返回上述对象可能会更好,改变你如何编写调用代码。

但是,如果格式失败不是常规的预期情况,或者您只做了一次,或者exception与返回值的性能差异甚至不会被注意到(这通常是这种情况),那么抛出exception – 这是一个干净的方式来处理无效的input,而不会污染函数的预期用例。

我们如何处理它,使其易于使用,而不是很昂贵?

如果不是正常预期的情况,那么在错误的input上抛出exception并不昂贵。 另外,除非这个代码处于某种紧密的循环中,并且多次调用,否则你甚至不会注意到返回值和抛出/捕获的exception之间的区别。 所以,我build议你编码,使预期的情况更容易编码和使用exception的意外情况。 然后,您的预期的代码path不会去例外路线。 换句话说,exception实际上是正常的“exception”。

在哪些情况下,即使太贵,抛出exception也会更合适?

见上面的描述。