【JS】try 和 throw 语句

文章目录

throw 语句:

  • throw语句用来抛出一个用户自定义的异常。
  • 当前函数的执行将被停止(throw之后的语句将不会执行),并且控制将被传递到调用堆栈中的第一个catch块。
  • 如果调用者函数中没有catch块,程序将会终止。
throw "Error2"; // 抛出了一个值为字符串的异常
throw 42;       // 抛出了一个值为整数42的异常
throw true;     // 抛出了一个值为true的异常
function getRectArea(width, height) {
  if (isNaN(width) || isNaN(height)) {
    throw 'Parameter is not a number!';
  }
}

try {
  getRectArea(3, 'A');
} catch (e) {
  console.error(e);
  // "Parameter is not a number!"
}

try 语句:

  • try...catch:语句标记要尝试的语句块,并指定一个出现异常时抛出的响应。
  • catch(e)中的参数e: 用来保存被抛出声明指定的值。你可以用这个标识符来获取关于被抛出异常的信息
try { // 书写可能会抛出异常的语句
  nonExistentFunction();
} catch (error) { // try 抛出异常时触发
  console.error(error);
  // 预期输出:ReferenceError: nonExistentFunction未定义  
  // 注意:错误消息将根据浏览器的不同而不同  
}
openMyFile()	// 打开一个文件
try { // 书写可能会抛出异常的语句
   // 占用资源
   writeMyFile(theData); // 操作文件
}finally { // try 抛出异常或没有异常都会触发
   closeMyFile(); // 总是关闭文件
}
try { // 书写可能会抛出异常的语句
   throw "myException"; // 生成一个异常
}catch (e) { // try 抛出异常时触发
   // catch 语句用来处理任何异常
   logMyErrors(e); // 将异常对象传递给错误处理程序
}finally { // try 抛出异常或没有异常都会触发
   console.log("finally 执行了"); // finally 总是会执行
}

嵌套用法:

  • 条件catch子句:
try {
  myRoutine();
} catch (e) {
  if (e instanceof RangeError) {
    // 语句来处理这个非常常见的预期错误
  } else {
    throw e;  // 重新抛出错误
  }
}
  • 嵌套 try
try {
  try {
    throw new Error("oops");
  }
  finally {
    console.log("finally");
  }
}
catch (ex) {
  console.error("outer", ex.message);
}

/* 预期输出 */
// "finally"
// "outer" "oops"
  • 在 try 语句中,通过增加一个 catch 语句块捕获了异常
try {
  try {
    throw new Error("oops");
  }
  catch (ex) {
    console.error("inner", ex.message);
  }
  finally {
    console.log("finally");
  }
}
catch (ex) {
  console.error("outer", ex.message);
}

/* 预期输出 */
// "inner" "oops"
// "finally"
  • 在 try 语句中,嵌套的 catch 语句块再次抛出错误
try {
  try {
    throw new Error("oops");
  }
  catch (ex) {
    console.error("inner", ex.message);
    throw ex;
  }
  finally {
    console.log("finally");
  }
}
catch (ex) {
  console.error("outer", ex.message);
}

/* 预期输出 */
// "inner" "oops"
// "finally"
// "outer" "oops"
上一篇:C++ 异常机制详解


下一篇:进阶练习:手写JavaScript数组多个方法的底层实现