编程语言都会须要欠缺的错误处理策略使得应用程序更为正当的操作谬误。错误处理在服务端的解决较为欠缺,然而浏览器端停顿较为迟缓,不同浏览器的错误处理形式也不同,且默认的错误处理形式对用户也不敌对。因而,必须了解各种捕捉和处理错误的形式。而在 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
子句中的代码,try
与 catch
都无奈阻止,包含 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.");
也能够调用特定的谬误类型生成一个谬误对象并抛出。如 SyntaxError
、TypeError
等。应用 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
:谬误的列号。error
:Error
对象。
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-cath
和 throw
两种处理错误的形式。然而两种错误处理形式,有不同的谬误场景要求。如果编写的库或函数须要晓得谬误产生的具体起因,就抛出异样;如果确切晓得接下来的操作,就捕捉谬误。而没有通过 try-catch
解决的谬误,能够应用 window.onerror
事件来解决。
更多内容请关注公众号「 海人为记 」