之前为了完成作业“猜数字游戏”,我们定义了一个函数compare(input),将input和系统生成的数值进行比较。
希望参数input都是数值(数值才能进行大小比较),但当参数input不是数字的时候
@想一想@:(对于该函数而言)如何处理最好?
我们之前的做法是:
console.log('请输入数字');
但是:
不要怕暴露问题,有问题一定要暴露出来,把问题偷偷摸摸的掩盖起来才是最大的问题!(这也是JavaScript最大的问题)
throw:暴露问题
后接任何表达式,如:字符串,整数,布尔值……,推荐 new Error('')
之后的代码不会继续执行。
只有在console中才能看到。
function compare(input) {
if (typeof input !== 'number') {
throw new Error('input不是数字');
}
console.log('继续正常执行……');
}
(演示:略)
try...catch
throw会阻止整个程序的运行,这是对于抛出异常一方而言;但对调用者而言,我们可能需要:
自行处理这个错误(因为这种错误有可能是非代码层面的,比如网络中断造成的),不一定是终止程序执行……
所以可以“捕获”异常,进行处理(JavaScript似乎也没什么好的处理办法……^_^)。
for (var i = 0; i < 3; i++) {
let input = prompt('你猜是:');
try {
compare(input);
console.log('in try: continue or success');
} catch (e) {
confirm('你输入的不是数字,请重新输入');
}
console.log('after try……catch');
}
注意:
(演示:略)
如果希望某段代码无论有无异常都执行,就需要将其放置在finally中。
比如在node.js中,可以操作文件/数据库等:
try {
//打开文件
console.log('open');
//操作
console.log('doing begin....');
throw new Error('文件操作异常');
console.log('doing end....');
} catch (e) {
console.log('处理异常');
} finally {
//关闭文件(其他用户才可以继续操作该文件)
console.log('close');
}
无论如何,都无法阻止finally的执行。
演示:,finally还是会执行
作业:
使用setTimeout创建以下三个异步函数,分别使用普通callback方式和Promise方式,完成如下逻辑:
多快好省!前端后端,线上线下,名师精讲
更多了解 加: