之前为了完成作业“猜数字游戏”,我们定义了一个函数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方式,完成如下逻辑:
多快好省!前端后端,线上线下,名师精讲
更多了解 加: