【问题标题】:Proper use of errors正确使用错误
【发布时间】:2023-04-10 10:33:01
【问题描述】:

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

throw new IndexOutOfBoundsException();

TypeScript 中的等效语句是:

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

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

【问题讨论】:

    标签: exception typescript


    【解决方案1】:

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

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

    【讨论】:

    【解决方案2】:

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

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

    注意

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

    【讨论】:

    • 感谢指向显式类型转换的指针。没有在 Typescript-Docs 中找到该信息,今天学到了一些东西。
    • 你知道添加的目的是什么吗? e.message 对我来说很好用。
    • @sbattou &lt;Error&gt; 的唯一目的是告诉 TS 编译器 e 这里的类型是 &lt;Error&gt; 以便您拥有 (1) 智能感知和 (2) 更好的类型检查。请注意,任何强制转换都不会转换为 JS,纯粹是语法糖。
    【解决方案3】:

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

    【讨论】:

    • 这很棒;似乎比其他答案更健壮、更干净。
    【解决方案4】:

    Someone posted this link to the MDN in a comment, and I think it was very helpful。它非常详尽地描述了诸如 ErrorTypes 之类的东西。

    EvalError --- 创建一个实例,表示在全局函数 eval() 中发生的错误。

    InternalError --- 创建一个表示当 JavaScript 引擎中的内部错误被抛出时发生的错误的实例。例如。 “递归过多”。

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

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

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

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

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

    【讨论】:

    • 它似乎缺少 invalid argument 的更通用类型。并非所有无效参数都属于RangeError。你应该定义自定义类型还是只定义throw new Error("&lt;message&gt;");
    • 这里有 7 个子类,但EvalInternalSyntaxURI 绝对不适合作为开发人员编写的代码中的错误,我也不适合确定Reference(JS 中的“取消引用”是什么?)。这留下了RangeType,但是您的代码中可能会出现无数其他类别的错误。 Range 回答了 OP 的具体问题,但这是例外(抱歉),而不是规则。
    猜你喜欢
    • 2013-01-10
    • 1970-01-01
    • 2021-11-06
    • 2020-04-17
    • 1970-01-01
    • 2018-02-27
    • 2019-05-25
    • 2017-11-02
    • 1970-01-01
    相关资源
    最近更新 更多