键盘敲烂,月薪过万作业不做,等于没学
当前系列: ES进阶 修改讲义

之前为了完成作业“猜数字游戏”,我们定义了一个函数compare(input),将input和系统生成的数值进行比较。

希望参数input都是数值(数值才能进行大小比较),但当参数input不是数字的时候

@想一想@:(对于该函数而言)如何处理最好?

我们之前的做法是:


console.log('请输入数字');
但是:


  • 随着项目规模增加,compare可能不仅仅用于“猜数字”,input不一定是用户输入啊!
  • 当input不是数值的时候,我们应该用一种“更醒目”的方式提示函数的调用者,而不是简单的return,让程序继续执行,带来更多不可预期的问题……
对于大型(large-scale)项目而言,负责任的做法是:

不要怕暴露问题,有问题一定要暴露出来,把问题偷偷摸摸的掩盖起来才是最大的问题!(这也是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');
}
注意:


  • catch后面圆括号中的e,就是被抛出的Error对象
  • 错误被捕获后,后续代码会继续执行
  • catch中还可以再次抛出异常

(演示:略)


finally

如果希望某段代码无论有无异常都执行,就需要将其放置在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的执行。

演示:
  • 在catch中抛出异常
  • 在try中return

,finally还是会执行




作业

使用setTimeout创建以下三个异步函数,分别使用普通callback方式和Promise方式,完成如下逻辑:

  1. getPassword(name):通过用户名获得他/她的密码
  2. login():如果密码正确,返回用户Id;否则,报一个异常
  3. getRecord():根据用户Id,返回该用户“打地鼠”游戏的最高记录
  4. 捕获抛出的异常,输出(console.log)异常信息
模拟Promise写一个MimicPromise类,能实现和Promise一样的功能(异步执行除外)
学习笔记
源栈学历
键盘敲烂,月薪过万作业不做,等于没学

作业

觉得很 ,不要忘记分享哟!

任何问题,都可以直接加 QQ群:273534701

在当前系列 ES进阶 中继续学习:

多快好省!前端后端,线上线下,名师精讲

  • 先学习,后付费;
  • 不满意,不要钱。
  • 编程培训班,我就选源栈

更多了解 加:

QQ群:273534701

答疑解惑,远程debug……

B站 源栈-小九 的直播间

写代码要保持微笑 (๑•̀ㅂ•́)و✧

公众号:源栈一起帮

二维码