正确使用错误

Nat*_*owe 137 exception typescript

我正在使用TypeScript进行一个相当大的项目,我想知道使用Errors 的标准是什么.例如,假设我在Java中处理了一个超出范围的索引:

throw new IndexOutOfBoundsException();
Run Code Online (Sandbox Code Playgroud)

TypeScript中的等效语句是:

throw new Error("Index Out of Bounds");
Run Code Online (Sandbox Code Playgroud)

我可以通过其他方式实现这一目标?什么是公认的标准?

Nat*_*owe 149

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

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

InternalError ---创建一个实例,表示在引发JavaScript引擎中的内部错误时发生的错误.例如"过多的递归".

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

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

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

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

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

  • 它似乎缺少一个更通用的**无效参数**类型。并非所有无效参数都属于“RangeError”。您应该定义自定义类型还是只是“抛出新错误(“<消息>”);”? (2认同)

bas*_*rat 56

JavaScript中超出范围的约定正在使用RangeError.要检查类型,请使用if/else + instanceof从最具通用性开始

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

  • Mozilla开发者网络上有一系列JavaScript错误类型和其他信息:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error (7认同)
  • @basarat我认为你应该添加`else {throw; 这里 (5认同)
  • 一般错误怎么办?和/或内置JS错误类的列表在哪里? (2认同)

Mac*_*ora 38

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

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

  • @sbattou `&lt;Error&gt;` 的唯一目的是告诉 TS 编译器,这里的 `e` 属于 `&lt;Error&gt;` 类型,以便您拥有 (1) 智能感知和 (2) 更好的类型检查。请注意,任何类型转换都不会转换为 JS 并且纯粹是语法糖。 (2认同)

Mor*_*rty 15

不要忘记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();
Run Code Online (Sandbox Code Playgroud)

  • 这很棒; 似乎比其他答案更强大和更干净。 (3认同)