扩展 Error
先了解下JavaScript 自身定义的内建的 Error 类的“伪代码”
class Error {
constructor(message) {
this.message = message;
this.name = "Error"; // (不同的内建 error 类有不同的名字)
this.stack = <call stack>; // 非标准的,但大多数环境都支持它
}
}
然后,再看下使用案例:
class ValidationError extends Error{
constructor(message){
super(message);
this.name = "ValidationError";
}
}
//用法
function readUser(json){
let user = JSON.parse(json);
if(!user.age){
throw new ValidationError("No Field: age");
}
if(!user.name){
throw new ValidationError("No Field: name");
}
return user;
}
//try...catch 的工作示例
try{
let user= readUser('{"age": 25}');
} catch(err){
if(err instanceof ValidationError){
alert("Invalid data:" + err.message);
} else if (err instanceof SyntaxError){
alert("JSON Syntax Error:" + err.message );
} else {
throw err; //未知的error,再次抛出
}
}
以上案例设计知识点说明:
1)instanceof 运算符 用于检测构造函数的 prototype 属性 是否出现在_某个实例对象的原型链上_
其使用语法如下:
2)类继承后重新命名部分的写法:
//第一种
class ValidationError extends Error{
constructor(message){
super(message);
this.name = "ValidationError"; // 每一个自定义类都需手动赋值
}
}
//第二种
class ValidationError extends Error{
constructor(message){
super(message);
// 用于创建自己的“基础错误(basic error)”类,然后让所有我们自定义的 error 都从这个“基础错误”类进行继承。如此就不用每一个自定义类中都重新手动赋值(像第一种写法那样)
this.name = this.constructor.name;
}
}
以上内容 参考于 https://zh.javascript.info/custom-errors ,在此学习记录!!!