今日话题,了解JavaScript的错误处理机制。bash
引用一个不存在的变量时发生的错误。将一个值分配给没法分配的对象,好比对函数的运行结果或者函数赋值。函数
举栗子ui
try {
console.log(a) // a 未声明的变量
} catch (e) {
if (e instanceof ReferenceError) {
console.log(e.name + ": " + e.message); // ReferenceError: a is not defined
}
}
复制代码
构建一个ReferenceErrorspa
try {
throw new ReferenceError('Hello', 'someFile.js', 10);
} catch (e) {
console.log(e instanceof ReferenceError); // true
console.log(e.message); // "Hello"
console.log(e.name); // "ReferenceError"
console.log(e.fileName); // "someFile.js"
console.log(e.lineNumber); // 10
console.log(e.columnNumber); // 0
console.log(e.stack); // "@Scratchpad/2:2:9\n"
}
复制代码
若是未声明变量就使用,就会抛出这个异常哦!
复制代码
变量或参数不是预期类型时发生的错误。好比使用new字符串、布尔值等原始类型和调用对象不存在的方法就会抛出这种错误,由于new命令的参数应该是一个构造函数。3d
举栗子code
try {
var a = {}
a.go()
} catch (e) {
if (e instanceof TypeError) {
console.log(e.name + ": " + e.message); // TypeError: a.go is not a function
}
}
复制代码
在ES5如下的JavaScript中,当eval()函数没有被正确执行时,会抛出evalError错误。orm
举栗子cdn
var myEval = eval;
myEval("alert('call eval')");
复制代码
ES5以上的JavaScript中已经再也不抛出该错误,但依然能够经过new关键字来自定义该类型的错误提示。
复制代码
数值变量或参数超出其有效范围对象
举栗子blog
try {
[].length = -1
} catch (e) {
if (e instanceof RangeError) {
console.log(e.name + ": " + e.message); // RangeError: Invalid array length
}
}
复制代码
语法错误,好比变量名不规范
举栗子
try {
var 1
} catch (e) {
if (e instanceof SyntaxError) {
console.log(e.name + ": " + e.message); // SyntaxError: Unexpected number
}
}
复制代码
给 encodeURI()或 decodeURl()传递的参数无效
举栗子
捕获一个URIError
try {
decodeURIComponent('%');
} catch (e) {
console.log(e instanceof URIError); // true
console.log(e.message); // "malformed URI sequence"
console.log(e.name); // "URIError"
console.log(e.fileName); // "Scratchpad/1"
console.log(e.lineNumber); // 2
console.log(e.columnNumber); // 2
console.log(e.stack); // "@Scratchpad/2:2:3\n"
}
复制代码
建立URIError实例
try {
throw new URIError('Hello', 'someFile.js', 10);
} catch (e) {
console.log(e instanceof URIError); // true
console.log(e.message); // "Hello"
console.log(e.name); // "URIError"
console.log(e.fileName); // "someFile.js"
console.log(e.lineNumber); // 10
console.log(e.columnNumber); // 0
console.log(e.stack); // "@Scratchpad/2:2:9\n"
}
复制代码