错误处理机制

原文地址:https://wangdoc.com/javascript/

Error实例对象

JavaScript解析或运行时,一旦发生错误,引擎就会抛出一个错误对象。JavaScript原生提供Error构造函数,所有抛出的错误都是这个构造函数的实例。

var err = new Error("Error message");
err.message // "Error message"

Error构造函数接受一个参数,表示错误信息。通过实例的message属性来获取。JavaScript语言标准只提到,Error实例对象必须有message属性,没有提到其他属性。大多数JavaScript引擎对Error实例还提供了namestack属性,分别表示错误的名称和错误的堆栈,但它们是非标准的。

  • message:错误提示信息
  • name:错误名称(非标准)
  • stack:错误的堆栈(非标准)

原生错误类型

Error实例对象是最一般的错误类型,在它的基础上,JavaScript还定义了其他6种错误对象。也就是说,存在Error的6个派生对象。

SyntaxError对象

SyntaxError对象时解析代码时发生的语法错误。

ReferenceError对象

ReferenceError对象是引用一个不存在的变量时发生的错误。将一个值分配给无法分配的对象,比如对函数运行结果或者this赋值。

RangeError对象

RangeError对象是一个值超出有效范围发生的错误。主要有几种情况,一是数组长度为负数,二是Number对象的方法参数超出范围,以及函数堆栈超过最大值。

TypeError对象

TypeError对象是变量或参数不是预期类型时发生的错误。比如对字符串、布尔值、数值等原始类型的值使用new命令,因为new命令的参数应该是一个构造函数,或者调用某个对象不存在的方法,也会抛出TypeError错误。

URIError

URIError对象是URI相关函数的参数不正确时抛出的错误,主要涉及encodeURI()decodeURI()encodeURIComponent()decodeURIComponent()escape()unescape()这六个函数。

EvalError对象

eval函数没有正确执行时,会抛出EvalError错误,该错误类型已经不再使用,为了兼容旧代码而保留。

自定义错误

JavaScript除了提供原生的七种错误对象外,还可以定义自己的错误对象。

function CustomError(message) {
    this.message = message || "Default error";
    this.name = "CustomError";
}
CustomError.prototype = new Error();
CustomError.prototype.constructor = CustomError

上面代码自定义了一个错误对象CustomError,它继承Error对象。然后,就可以生成这种自定义类型的错误了。

throw语句

throw语句作用是手动中断程序执行,抛出一个错误。
实际上,throw可以抛出任何类型的值。也就是说,它的参数可以是任何值。

throw "Error";
throw 42;
throw {};

try...catch结构

一旦发生了错误,程序就中止执行。JavaScript提供了try...catch结构,允许对错误进行处理,选择是否往下执行。
为了捕捉不同类型的错误,catch代码块中可以加入判断语句。

try {
    // ...
} catch (e) {
    if (e instanceof EvalError) {
        // ...
    } else if (e instanceof RangeError) {
        // ...
    }
    // ...
}
## finally代码块
<font color=red>try...catch</font>结构允许在最后添加一个<font color=red>finally</font>代码块,表示不管是否出现错误,都必须在最后运行的语句。
原文地址:https://www.cnblogs.com/chris-jichen/p/10038116.html