错误处理

2019-01-14  本文已影响10人  SingleDiego
try ... catch ... finally

JavaScript 使用 try ... catch ... finally 语句来处理错误。

例子如下:

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

// 运行结果
出错了:TypeError: Cannot read property 'length' of null
finally
r1 = undefined
r2 = undefined

我们来分析一下使用 try ... catch ... finally 的执行流程。

当代码块被 try { ... } 包裹的时候,就表示这部分代码执行过程中可能会发生错误,一旦发生错误,就不再继续执行后续代码,转而跳到 catch 块。

catch (e) { ... } 包裹的代码就是错误处理代码,变量 e 表示捕获到的错误。最后,无论有没有错误,finally 一定会被执行。

所以,有错误发生时,执行流程像这样:

而没有错误发生时,执行流程像这样:

最后请注意,catchfinally 可以不必都出现。




错误类型

JavaScript 有一个标准的 Error 对象表示错误,还有从 Error 派生的TypeErrorReferenceError 等错误对象。

我们在处理错误时,可以通过 catch(e) 捕获的变量 e 并访问错误对象。

var r1, r2, s = null;
try {
    r1 = s.length; // 此处应产生错误
    r2 = 100; // 该语句不会执行
} catch (e) {
    if (e instanceof TypeError) {
        console.log('e is Type Error');
    } else if (e instanceof Error) {
        console.log(e.message);
    } else {
        console.log('Error: ' + e);
    }
} finally {
    console.log('finally');
}

使用变量 e 是一个习惯用法,也可以以其他变量名命名,如 catch(ex)




抛出错误

程序也可以主动抛出一个错误,让执行流程直接跳转到 catch 块。抛出错误使用 throw 语句。

例如,下面的代码让用户通过 prompt 方法输入一个数字,程序接收到的实际上是一个字符串,然后用 parseInt() 转换为整数。当用户输入不合法的时候 parseInt() 的结果是 NaN,我们就抛出错误:

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);
}
上一篇下一篇

猜你喜欢

热点阅读