正确使用错误

Posted

技术标签:

【中文标题】正确使用错误【英文标题】:Proper use of errors 【发布时间】:2014-07-10 12:40:04 【问题描述】:

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

throw new IndexOutOfBoundsException();

TypeScript 中的等效语句是:

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

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

【问题讨论】:

【参考方案1】:

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

try 
    throw new RangeError();

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

【讨论】:

一般错误怎么办?和/或内置 JS 错误类的列表在哪里? Mozilla 开发者网络上有一个 JavaScript 错误类型列表和其他信息:developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… @basarat 我认为你应该在这里添加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 的具体问题,但这是例外(抱歉),而不是规则。

以上是关于正确使用错误的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Capybara 使用正确的错误消息断言元素数量?

出现错误 `''' 附近的语法不正确。 ` 使用 PHP 创建 MSSQL 表时

错误 MariaDB 服务器版本的原因是啥,以便在附近使用正确的语法

在 TypeScript 中使用 Promises 的异步函数的正确错误模式

如何正确使用 Core Data 验证和错误框架?

使用 redux-promise 处理 redux 错误的正确方法