正确使用错误
Posted
技术标签:
【中文标题】正确使用错误【英文标题】:Proper use of errors 【发布时间】:2014-07-10 12:40:04 【问题描述】:我在一个相当大的项目中使用 TypeScript,我想知道使用 Error
s 的标准是什么。例如,假设我在 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 中找到该信息,今天学到了一些东西。 你知道添加<Error>
的唯一目的是告诉 TS 编译器 e
这里的类型是 <Error>
以便您拥有 (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("<message>");
?
这里有 7 个子类,但Eval
、Internal
、Syntax
和 URI
绝对不适合作为开发人员编写的代码中的错误,我也不适合确定Reference
(JS 中的“取消引用”是什么?)。这留下了Range
和Type
,但是您的代码中可能会出现无数其他类别的错误。 Range
回答了 OP 的具体问题,但这是例外(抱歉),而不是规则。以上是关于正确使用错误的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Capybara 使用正确的错误消息断言元素数量?
出现错误 `''' 附近的语法不正确。 ` 使用 PHP 创建 MSSQL 表时
错误 MariaDB 服务器版本的原因是啥,以便在附近使用正确的语法