正确使用错误

我正在使用TypeScript进行一个相当大的项目,我想知道使用Errors的标准是什么。例如,我在Java中抛出了一个索引越界异常:

throw new IndexOutOfBoundsException();

在TypeScript中等价的语句是:

throw new Error("Index Out of Bounds");

还有什么其他方法可以实现这个目标?公认的标准是什么?

239558 次浏览

JavaScript中超出范围的约定是使用RangeError。要检查类型,请使用if / else + instanceof从最特定的最泛型开始

try {
throw new RangeError();
}
catch (e){
if (e instanceof RangeError){
console.log('out of range');
} else {
throw;
}
}

有人在评论中发布了这个MDN的链接,我认为这很有帮助。它非常全面地描述了ErrorTypes之类的东西。

EvalError——创建一个实例,表示关于全局函数eval()发生的错误。

InternalError——创建一个实例,表示抛出JavaScript引擎内部错误时发生的错误。如。 "too much recursion".

.

RangeError——创建一个实例,表示数值变量或参数超出有效值时发生的错误 范围。< / p >

ReferenceError——创建一个实例,表示取消引用无效引用时发生的错误。

SyntaxError——创建一个实例,表示在eval()中解析代码时发生的语法错误。

TypeError——创建一个实例,表示当变量或参数不是有效类型时发生的错误。

URIError——创建一个实例,表示当encodeURI()或decodeURI()被传递无效参数时发生的错误。

通过异常发出和显示消息的简单解决方案。

try {
throw new TypeError("Error message");
}
catch (e){
console.log((<Error>e).message);//conversion to Error type
}

谨慎

如果我们不知道可以从块中发出什么样的错误,上面不是一个解决方案。在这种情况下,应该使用类型保护,并对适当的错误进行适当的处理-看看@Moriarty的回答。

不要忘记switch语句:

  • 确保使用default进行处理。
  • instanceof可以匹配超类。
  • ES6 constructor将在确切的类上匹配。
  • 更容易阅读。

function handleError() {
try {
throw new RangeError();
}
catch (e) {
switch (e.constructor) {
case Error:      return console.log('generic');
case RangeError: return console.log('range');
default:         return console.log('unknown');
}
}
}


handleError();