Skip to content

错误处理,“try……catch”

有一种语法结构 try...catch,它使我们可以“捕获(catch)”错误,因此脚本可以执行更合理的操作,而不是死掉。

  1. “try…catch” 语法
JavaScript
	try {

	  // 代码...
	
	} catch (err) {
	
	  // 错误捕获
	
	}
  1. try...catch 仅对运行时的 error 有效
  2. try...catch 同步执行
  3. Error 对象
    1. 发生错误时,JavaScript 会生成一个包含有关此 error 详细信息的对象。然后将该对象作为参数传递给 catch
  4. 可选的 “catch” 绑定
    1. 使用 “try…catch”
    2. 如果 json 格式错误,JSON.parse 就会生成一个 error,因此脚本就会“死亡”。
    3. 抛出我们自定义的 error
    4. “throw” 操作符
  5. 再次抛出(Rethrowing)
    1. catch 应该只处理它知道的 error,并“抛出”所有其他 error。
  6. try…catch…finally
JavaScript
try {
   ... 尝试执行的代码 ...
} catch (err) {
   ... 处理 error ...
} finally {
   ... 总是会执行的代码 ...
}

自定义 Error,扩展 Error

  1. 扩展 Error
JavaScript
class ValidationError extends Error {
  constructor(message) {
    super(message); // (1)
    this.name = "ValidationError"; // (2)
  }
}

function test() {
  throw new ValidationError("Whoops!");
}

try {
  test();
} catch(err) {
  alert(err.message); // Whoops!
  alert(err.name); // ValidationError
  alert(err.stack); // 一个嵌套调用的列表,每个调用都有对应的行号
}
  1. 深入继承
JavaScript
class ValidationError extends Error {
  constructor(message) {
    super(message);
    this.name = "ValidationError";
  }
}

class PropertyRequiredError extends ValidationError {
  constructor(property) {
    super("No property: " + property);
    this.name = "PropertyRequiredError";
    this.property = property;
  }
}

// 用法
function readUser(json) {
  let user = JSON.parse(json);

  if (!user.age) {
    throw new PropertyRequiredError("age");
  }
  if (!user.name) {
    throw new PropertyRequiredError("name");
  }

  return user;
}

// try..catch 的工作示例

try {
  let user = readUser('{ "age": 25 }');
} catch (err) {
  if (err instanceof ValidationError) {
    alert("Invalid data: " + err.message); // Invalid data: No property: name
    alert(err.name); // PropertyRequiredError
    alert(err.property); // name
  } else if (err instanceof SyntaxError) {
    alert("JSON Syntax Error: " + err.message);
  } else {
    throw err; // 未知 error,将其再次抛出
  }
}
  1. 包装异常
JavaScript
try {
  ...
  readUser()  // 潜在的 error 源
  ...
} catch (err) {
  if (err instanceof ValidationError) {
    // 处理 validation error
  } else if (err instanceof SyntaxError) {
    // 处理 syntax error
  } else {
    throw err; // 未知 error,再次抛出它
  }
}