try…catch
1.语法
try{
//代码块
}catch(err){
//错误捕获
}
说明:
1)首先执行 ** try ** 中的代码;
2)如果没有错误会一直执行到 ** try** 结束,跳过 catch(err) 继续执行;
如果有错误,则停止执行 try, 控制流转向 catch(err) 开始处执行,变量 ** err ** 包含了所发生事情的详细信息的 error 对象
所以,try {…} 块内的错误不会杀死脚本 — 我们有机会在 catch 中处理它。
try…catch 只能处理有效代码中出现的错误
2.error对象
看个例子:
try{
alert(1);
lalala;
alert(2);
}catch(err){
alert('error has occurred!');
console.log(err);
console.log('name:'+ err.name);
console.log('message:'+ err.message);
console.log('stack:'+ err.stack);
}
3.抛出自定义的 error
1) “Throw” 操作符
看个例子:
假如我们从服务器端获取一段json数据,获取user.name:
let json = '{"age" : 30}';
try{
let user = JSON.parse(json);
alert(user.name); // undefined 没有name
}catch(err){
alert('error has occurred!'); //未执行
}
上面的例子中,语法没问题,但没有所必须的name,alert为undefined 属于错误,那如何处理这个error呢?
此时,我们可以使用 throw 操作符。
let json = '{"age" : 30}';
try{
let user = JSON.parse(json);
if(!user.name){
throw new SyntaxError("Incomplete data: no name"); // SyntaxError语法错误
}
}catch(err){
alert( "JSON Error: " + err.message ); // JSON Error: Incomplete data: no name
}
2) 再次抛出(Rethrowing)
try…catch 中使用 ** throw ** 旨在捕获“数据不正确”的 error,
但是实际上,catch 会捕获到 所有 来自于 try 的 error,错误如下代码和图:
let json = '{ "age": 30 }'; // 不完整的数据
try {
user = JSON.parse(json); // <-- 忘记在 user 前放置 "let"
// ...
alert( user.name );
} catch(err) {
alert("JSON Error: " + err); // JSON Error: ReferenceError: user is not defined
// (实际上并没有 JSON Error)
}
因此,我们可以采用“重新抛出”技术
1)Catch 捕获所有 error
2)在 catch(err) {…} 块中,我们对 error 对象 err 进行分析
3)如果我们不知道如何处理它,那我们就 throw err
通常,我们可以使用 ==instanceof ==操作符判断错误类型:
try {
user = { /*...*/ };
} catch(err) {
if (err instanceof ReferenceError) {
alert('ReferenceError'); // 访问一个未定义(undefined)的变量产生了 "ReferenceError"
}
}
进一步细化上面的案例:
let json = '{ "age": 30 }'; // 不完整的数据
try {
let user = JSON.parse(json);
if (!user.name) {
throw new SyntaxError("Incomplete data: no name");
}
blabla(); // 预料之外的 error
alert( user.name );
} catch(e) {
if (e instanceof SyntaxError) {
alert( "JSON Error: " + e.message );
} else {
throw e; // 再次抛出 (*)
}
}
以上内容参考于 https://zh.javascript.info/try-catch , 在此学习记录!!!