乐趣区

关于程序员:快速了解JavaScript的错误处理

编程语言都会须要欠缺的错误处理策略使得应用程序更为正当的操作谬误。错误处理在服务端的解决较为欠缺,然而浏览器端停顿较为迟缓,不同浏览器的错误处理形式也不同,且默认的错误处理形式对用户也不敌对。因而,必须了解各种捕捉和处理错误的形式。而在 ECMA-262 的第 3 版中减少了 try-catch 语句块和 throw 语句来处理错误,以及一些谬误类型来形容谬误。

try-catch

ECMA-262 新增的错误处理形式与 Java 类似,将可能出错的代码放在 try 子句中,而处理错误的代码放在 catch 子句中:

try {// Possible error code} catch (e) {// Error Handler}

catch 子句中捕捉到的谬误对象蕴含产生谬误的相干信息,通过该谬误对象能够获取谬误类型的 name 属性和保留谬误音讯的 message 属性,e.message 即可调用。

在应用 try-catch 语句块时,要晓得什么时候应用最好。如果产生无法控制的谬误上,就须要应用 try-catch 语句块来处理错误;如果明确晓得代码会产生某种谬误,就要采纳相应的操作来避免谬误产生,而不是应用 try-catch 语句块来处理错误。

finally

try-catch 语句块中,无论是 try 子句执行完,还是 catch 子句执行完,都能够接着执行 finally 子句中的代码,trycatch 都无奈阻止,包含 return 语句。

function test(){
    try {return 1;} catch (e){throw e;} finally {return false;}
}

下面的办法,最初会返回 false

留神:次要代码中蕴含了 finally 子句,try 块或 catch 块中的 return 语句就会被疏忽,了解这一点很重要。在应用 finally 时肯定要认真确认代码的行为。

抛出谬误

应用 throw 抛出谬误是另一种错误处理形式。throw 抛出任意表达式。如下所示:

throw "Not Value Error";        // String type error
throw 31;                       // Number type error
throw false;                    // Boolean type error
throw {name: "JavaScript"};   // Object type error

也能够调用 Error 构造函数来生成一个谬误对象抛出,接管的值为谬误音讯。如下所示:

throw new Error("Null value Error.");

也能够调用特定的谬误类型生成一个谬误对象并抛出。如 SyntaxErrorTypeError 等。应用 ES6 中的继承语法创立谬误类型也能够,这样须要提供 name 属性和 message 属性。如下所示:

class CustomError extends Error {constructor(message) {super(message);
        this.name = "CustomError";
        this.message = message;
    }
}
throw new CustomError("Null Value Error.");

这种形式有助于在捕捉谬误时更精准地区分谬误。

Error

Error 谬误类型是根本类型,其它谬误类型根本都是继承该类型。Error 提供了一个构造方法用来创立实例对象,当产生谬误时,Error 通过构造方法创立实例对象并被抛出。

throw new Error("Null Value Error.");

Error 谬误类型提供了三个属性:

  • name:字符串类型。示意谬误名称。
  • message:字符串类型。示意错误信息。
  • stack:字符串类型。示意谬误的堆栈。

ECMA-262 总共定义了 8 种谬误类型,除了 Error 通用的谬误类型外,还有如下几种类型:

  • EvalError:该谬误类型会在应用 eval() 函数产生谬误时抛出。
  • InternalError:该谬误类型次要会在底层 JavaScript 引擎抛出异样时由浏览器抛出。如递归过多导致栈溢出。通常并不是须要解决的谬误。
  • RangeError:该谬误类型会在数值变量或参数越界时抛出。
  • ReferenceError:该谬误类型会在援用有效时抛出。
  • SyntaxError:该谬误类型会在 eval() 在解析代码的过程中产生。
  • TypeError:该谬误类型会在变量或参数不是预期类型,或者拜访不存在的办法时抛出。
  • URIError:该谬误类型只会在应用 encodeURI()decodeURI(),并且传入的 URI 格局谬误时产生。

浏览器很少会抛出 Error 类型的谬误,次要是开发者抛出的自定义谬误。而其它谬误类型能够应用 instanceof 进行判断。如下所示:

try {// Possible error code} catch (e) {if (e instanceof TypeError) {// Type Error Handler} else if (e instanceof ReferenceError) {// Reference Error Handler} else {// Other Error Handler}
}

error 事件

没有被 try-catch 捕捉的谬误都会在 window 对象上触发 error 事件。该事件会传入 3 个参数:

  • message:谬误音讯。
  • url:产生谬误的 URL
  • line:谬误的行号。
  • colno:谬误的列号。
  • errorError 对象。
window.onerror = (message, url, line, colno, error) => {
    // 能够对谬误的音讯进行解决,这里打印在管制台上
    console.log(message);
    return false; // 这里返回 false 来阻止浏览器默认报告谬误的行为
};

通过返回 false,函数实际上变成整个文档的 try/catch 语句,能够捕捉所有未解决的运行时谬误。适当的 try-catch 语句块意味着不会有谬误达到浏览器这个 档次,因而就不会触发 error 事件。当返回 true,会阻止执行默认事件处理函数。

而有一些资源加载失败,会触发一个 error 事件,这个事件遵循 DOM 格局。因而能够应用 addEventListener 捕捉。

const image = new Image();
image.addEventListener("error", (event) => {console.log("Image not loaded!");
});
image.src = "resource.gif"; // 不存在,资源会加载失败。

总结

一个设计良好的错误处理对编程语言非常重要。JavaScript 提供的 try-caththrow 两种处理错误的形式。然而两种错误处理形式,有不同的谬误场景要求。如果编写的库或函数须要晓得谬误产生的具体起因,就抛出异样;如果确切晓得接下来的操作,就捕捉谬误。而没有通过 try-catch 解决的谬误,能够应用 window.onerror 事件来解决。

更多内容请关注公众号「 海人为记

退出移动版