1. 基本知识
1. 错误对象
Error,SyntaxError,RangeError, ReferenceError,TypeError,URIError
上面的都是构造函数;
new 命令可以生成错误实例对象; 可以传入描述作为参数, 成为实例对象的 message 属性;
除了 message 属性, 还有两个非标准属性 (name, stack)stack 是调用栈
- var err = new Error("错误实例");
- err.message; // "错误实例"
- err.name; //"Error"
- err.stack;//"Error: 错误实例 at <anonymous>:1:11"
2. throw 语句
throw 语句, 如果不进行捕获 (try...catch...), 会中断程序执行.
throw 命令可以抛出任何类型的值; 抛出什么, 则捕获的就是什么!
- try{
- throw "error"
- } catch(err){
- console.log(err); //"error"
- }
3.try...catch...finally.. 语句
使用 try...catch... 语句后, 可以捕获错误, 防止代码崩溃;
1)JS 中, 程序执行遇到 return, throw 后, 后面的语句不再执行;
- try{
- throw "this is a error";
- console.log("after throw"); // 永远不会执行
- } catch(error) {
- console.log(error);
- }
- // 返回 "this is a error"
2) 浏览器中单独的 try 代码块中不能使用 return; 否则报错; 而且 catch 无法捕获
- try{
- return "this is a error";
- } catch {
- }
- // Uncaught SyntaxError: return not in a function
由上面可以知道, return 语句必须用在 function 中. 另外, yield 语句也是必须在函数中被调用.
如果想在 try/catch/finally 代码块中使用 return 语句, 可以在外面包裹一层 function.
3)catch 语句
如果 try 代码块中代码本身不抛出异常, 也没有手动抛出异常, 程序永远不会进入 catch 代码块.
- try {
- console.log("throw nothind");
- } catch { // 参数可以省略
- console.log("永远不会执行"); // try 没有抛出错误, 不会进入 catch; 永远不会被打印,
- }
如果 try 代码块中抛出异常, 则代码进入 catch 代码块执行完后, 继续原来的代码执行.
- try {
- throw "error";
- } catch { // 参数可以省略
- console.log("catch")
- }
- console.log('after');
- // catch
- // after
4)finally 语句
finally 语句不论是否抛出异常, 都会执行. 且 try 后者 catch 中的 return 语句取值会在 finally 之前取值.
- var count = 1;
- function test() {
- try {
- console.log("try");
- throw new Error("this is a error");
- } catch(err) {
- console.log("catch error");
- return count;
- } finally {
- console.log("finally")
- count+=1;
- }
- console.log("after"); // 永远不会执行
- }
- test();
- // try
- // catch error
- // finally
- // 1 最后返回 1, 说明 return 在 finally 执行前先执行, 但是最后才返回
如果在该代码块 return 语句, 会覆盖 try,catch 中的 return 语句
- var count = 1;
- function test() {
- try {
- console.log("try");
- throw new Error("this is a error");
- } catch(err) {
- console.log("catch error");
- return count;
- } finally {
- console.log("finally")
- count+=1;
- return count;
- }
- console.log("after"); // 永远不会执行, 因为前面有 return 语句
- }
- test();
- // try
- // catch error
- // finally
- // 2 执行的是 finally 语句中的 return 语句
4. finally 语句应用
示例: 操作文件时, 打开文件写入, 不管是否写入成功, 都要关闭文件
- // 伪代码如下
- openFile();
- try {
- writeFile()
- } catch(err) {
- console.log("写入失败");
- } finally {
- closeFile(); // 总要执行
- }
2. 实践应用
当使用接口请求服务器数据时, 一般都要使用 try...catch... 方法, 预防接口报错, 程序崩溃!
来源: http://www.bubuko.com/infodetail-3234419.html