正确使用错误


155

我正在将TypeScript用于一个相当大的项目,并且想知道使用Errors 的标准是什么。例如,假设我在Java中将索引超出范围例外:

throw new IndexOutOfBoundsException();

TypeScript中的等效语句为:

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

我还有什么其他方法可以做到这一点?公认的标准是什么?

Answers:


167

有人在评论中将此链接发布到了MDN,我认为这非常有帮助。它非常详尽地描述了诸如ErrorTypes之类的东西。

EvalError-创建一个实例,该实例表示与全局函数eval()有关的错误。

InternalError- 创建一个实例,该实例表示在JavaScript引擎中引发内部错误时发生的错误。例如“太多的递归”。

RangeError ---创建一个实例,该实例表示当数字变量或参数超出其有效范围时发生的错误。

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

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

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

URIError-创建一个实例,该实例表示在将encodeURI()或encodeURI()传递给无效参数时发生的错误。


它似乎缺少用于无效参数的更通用的类型。并非所有无效参数都属于RangeError。您应该定义自定义类型还是throw new Error("<message>");
anddero

58

JavaScript中超出范围的约定使用RangeError。要检查类型,请使用是否/ else + instanceof从最具体到最通用

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

2
一般错误呢?和/或内置JS错误类的列表在哪里?
pitosalas 2015年

7
还有在Mozilla开发者网络的JavaScript错误类型等信息的列表:developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...
基督教Davén

6
@basarat我认为您应该在else { throw; }此处添加
knocte

43

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

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

警告

如果我们不知道从块中发出什么样的错误,上述方法不是解决方案。在这种情况下,应使用类型防护措施,并应进行适当的处​​理以解决适当的错误-查看@Moriarty答案。


感谢您指向显式类型转换的指针。尚未在Typescript-Docs中找到该信息并从中学到了一些东西。
JackLeEmmerdeur '18

您知道添加<Error>的目的是什么吗?e.message对我来说很好。
sbattou

1
@sbattou的唯一目的<Error>是告诉TS编译器e这里的类型,<Error>以便您具有(1)intellisense和(2)更好的类型检查。请注意,尽管任何类型转换都根本不会转换为JS,并且纯粹是语法糖。
Didii '19

24

不要忘了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();


3
这很棒; 似乎比其他答案更强大,更干净。
Victor Zamanian
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.