/*P101-异常*
//程序中各种原因造成错误,导致程序无法继续运行的情况
//出现异常,就不会继续执行

//访问未定义变量,内置异常
// console.log(a);//Uncaught ReferenceError: a is not defined
// console.log('上面一行不注释掉,这行不会执行');//出现异常停止继续运行

//访问未定义对象的属性
var emp = undefined;
console.log(emp.name);//Uncaught TypeError: Cannot read property 'name' of undefined
/** */

/*P102-捕获异常
//把捕获之后,程序就能继续执行
//try中放要监控的代码,catch用来接收抛出来的异常再处理它

//语法
//3个关键字{}这样的样式,try,catch(),finally
//catch()带参数,参数就是接收到的错误或异常
//finally中的语句,无论是否有异常都会执行
//console.error的打印效果是红底红字

try{
    var emp = undefined;
    console.log(emp.name);
} catch(err){
    console.log(err);
    console.error(err);//TypeError: Cannot read property 'name' of undefined//打印结果会显示成红底红字
    console.error('这行会处理');//这行会处理//打印出字符串红底红字
} finally{
    console.log('总会执行');//总会执行//普通颜色。finally中的语句,无论是否有异常都会执行
}

console.log('上面捕获异常,这行会执行');//上面捕获异常,这行会执行
/** */

/*P103-异常-throw抛出异常
//上节是系统抛出异常,我们也可以主动抛出异常
//比如请求数据的时候,发现出了一个问题,我们可以抛出异常,让负责展示HTML页面的代码处理异常

//throw可以抛出任何数据类型,但建议使用error对象,或者基于error对象封装自己的异常

function fetchData(){
    console.log('获取数据...');//标记45
    throw '404';//以字符串类型
}

////直接调用,显示未捕获 404,而且下面代码不会再执行
//fetchData();//Uncaught 404//需要注释掉

try{
    fetchData();
} catch(e){
    console.log(e);//标记55
    if(e==='404'){
        console.error('未查询到数据');//标记57
    }
}
/*
标记45:获取数据...
标记55:404//普通显示404,字符串样式,不是上节那样的系统提示
标记57:未查询到数据//红底红字
*/
/** */

/*P104-异常-error对象*/
//throw 抛出error对象,new Error('404')对象接收消息属性,
//根据对象的名字和消息可以做一些异常处理的操作

/*一般用法
function fetchData(){
    console.log('获取数据...');//标记71
    throw new Error('404');//标记72
}

try{
    fetchData();//标记76
} catch(e){
    console.log(e);//标记78
    console.log(typeof e);//标记79 object
    console.log(e.name);//标记80
    console.log(e.message);//标记81
}
/*
index.js:78 Error: 404
    at fetchData (index.js:72)
    at index.js:76
index.js:79 object
index.js:80 Error
index.js:81 404
*/
/** */

/*自定义错误对象
//根据对象Error对象创建自定义的对象,成为程序中特有的异常
//比如例子中,fetchData()会抛出一个ApiError,专门标志从后台取数据出错误的情况
//添加额外属性,比如url属性,代表哪个路径出问题

//定义ApiError:
//定义class必须小写
//继承自Error

class ApiError extends Error{
    constructor(url, ...params){
        super(...params);
        this.url = url;
        this.name='ApiError';
    }
}

function fetchData(){
    console.log('获取数据...');//标记114
    throw new ApiError('/post','404');//标记115
}

try{
    fetchData();//标记119
} catch(e){
    console.log(e);//标记121
    console.log(typeof e);//标记122
    console.log(e.name);//标记123
    console.log(e.message);//标记124
    console.log(e.url);//标记125
}
/*
index.js:121 ApiError: 404
    at fetchData (http://127.0.0.1:5500/index.js:115:11)
    at http://127.0.0.1:5500/index.js:119:5
index.js:122 object
index.js:123 ApiError
index.js:124 404
index.js:125 /post
*/
//这节的class部分,因为之前的对象部分从原型后没有听课,所以,回头补完课,要再来听本节。
/** */

/*P105-异常-捕获多个异常
//一个代码可能抛出多个异常
//利用这些Error对象可以对不同的异常分别进行处理

//先出来的问题:似乎一次try只能1个错误被catch抓住?下面例子中
//判断不同类型的问题,利用instanceof,判断是否是某个对象的实例。
class ApiError extends Error{
    constructor(url, ...params){
        super(...params);
        this.url = url;
        this.name='ApiError';
    }
}

function fetchData(){
    console.log('获取数据...');//标记154
    console.log(a);//标记155 产生错误:访问未定义变量造成的错误:注意中文语法访问未定义变量造成的错误,的的的什么的,这样就是所属关系。加上造成的就好了。
    throw new ApiError('/post','404');//标记156
}

try{
    fetchData();//标记160
} catch(e){
    console.error(e);
    console.log(e.name);//标记163
    console.log(e.message);//标记164

   if(e instanceof ReferenceError){//ReferenceError指的是内置的错误对象
       console.log('程序异常...');
   } else if(e instanceof ApiError){
       console.log('API 异常');
   }
}
/*
index.js:162 ReferenceError: a is not defined
    at fetchData (index.js:155)
    at index.js:160
(匿名) @ index.js:162
index.js:163 ReferenceError
index.js:164 a is not defined
index.js:167 程序异常...
*/

//上面例子中,标记155不注释掉,下面就捕获不到标记156抛出的异常。
//本节不是说捕获多个异常么?这不应该是一个一个异常都被捕获然后安排得明明白白的么?
//如何实现,难道用多个trycatch逐个对应可能出现异常都语句么?
//例子中是要求只能出一个错吧。可能适合那种也是ifelse来抛出异常的情况。
/** */


扫一扫 手机查看

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注