JavaScript 入门(06)错误处理

错误处理

  • 使用 try—catch—finally 基本和 java 的用法是一致的
var r1, r2, s = null;
try {
    r1 = s.length; // 此处应产生错误
    r2 = 100; // 该语句不会执行
} catch (e) {
    console.log('出错了:' + e);
} finally {
    console.log('finally');
}
console.log('r1 = ' + r1); // r1应为undefined
console.log('r2 = ' + r2); // r2应为undefined
  • JavaScript有一个标准的Error对象表示错误,还有从Error派生的TypeError、ReferenceError等错误对象
  • Error 对象的两个属性:name 和 message
  • 程序也可以主动抛出一个错误,让执行流程直接跳转到catch块,抛出错误使用throw语句
var r, n, s;
try {
    s = prompt('请输入一个数字');
    n = parseInt(s);
    if (isNaN(n)) {
        throw new Error('输入错误');
    }
    // 计算平方:
    r = n * n;
    console.log(n + ' * ' + n + ' = ' + r);
} catch (e) {
    console.log('出错了:' + e);
}

错误传播

  • js 中发生错误之后如果没有try—catch语句的话,错误会从发生的地方一层一层往上抛出,直到js引擎中断程序
  • 我们进行错误的处理,不必到处都写try–catch语句,适当的 地方进行统一处理就可以了
function main(s) {
    console.log('BEGIN main()');
    try {
        foo(s);
    } catch (e) {
        console.log('出错了:' + e);
    }
    console.log('END main()');
}

function foo(s) {
    console.log('BEGIN foo()');
    bar(s);
    console.log('END foo()');
}

function bar(s) {
    console.log('BEGIN bar()');
    console.log('length = ' + s.length);
    console.log('END bar()');
}

main(null);

异步错误处理

  • 下面的代码中,错误无法被捕获,原因就在于调用setTimeout()函数时,传入的printTime函数并未立刻执行!紧接着,JavaScript引擎会继续执行console.log('done');语句,而此时并没有错误发生;直到1秒钟后,执行printTime函数时才发生错误,但此时除了在printTime函数内部捕获错误外,外层代码并无法捕获
  • 简单来说就是对于像setTimeout这样的异步代码,错误的捕获只能在回调函数中进行,外部是无法进行的
function printTime() {
    throw new Error();
}

try {
    setTimeout(printTime, 1000);
    console.log('done');
} catch (e) {
    console.log('error');
}
  • 修改后的代码如下
function printTime() {
	try {
    	throw new Error();
    } catch (e) {
    	console.log('error');
	}
}
setTimeout(printTime, 1000);
console.log('done');

在这里插入图片描述

发布了153 篇原创文章 · 获赞 51 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/stanwuc/article/details/103991309