您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

异常处理

异常处理可以使程序在流程上更加完善。

在 JavaScript 中可以使用 throw 抛出异常,使用 try ... catch 捕获。

throw 语句用来抛出的异常。(MDN)

throw 用于抛出异常,这种异常通常是程序出现了不符合预期的。

alert('出错前');

throw '发生了!';

alert('出错后');

当出现 throw 时,程序将会中断执行。

如果 throw 发生在 try ... catch 中,则会执行 catch 中的块,同时将带给 catch。

try…catch 语句要尝试的语句块,并指定出现异常时抛出的响应。

try ... catch 可以用于捕获异常,当出现 throw 时,会结束 try 内的执行,直接进入到 catch,执行 catch 内的块。

try {
  alert('出错前');

  throw '发生了!';

  alert('出错后');
} catch (e) { // e 是信息,名字随意,符合变量命名规范就行
  alert('出错了!是:' + e);
}

需要注意的是,以前 catch 后面的参数是必须接收的,否则会报错。

但 ES2019 中有提案,可以选择性的提供给 catch 参数,所以最新的 chrome 不传递参数也是可以的。

try {
  alert('出错前');

  throw '发生了!';

  alert('出错后');
} catch {
  alert('出错了!');
}

由于是比较新的提案,所以建议没有工具参与编译时,还是写上参数的接收,避免因浏览器兼容性造成的问题。

在 try 后面还可以跟 finally 部分,即无论 try 中的块是否抛出,都会执行 finally 块。

try {
  alert('开始请求数据,loading ');

  throw '没有网络';

  alert('请求结果是:..编不下去了,反正到不了这里');
} catch (e) {
  alert('出现:' + e);
} finally {
  alert(' loading');
}

部分文献记载了如下格式的 try … catch 语法。

try {
  throw 'error';
} catch (e if e instanceof TypeError) {
  console.log('TypeError');
} catch (e if e instanceof ReferenceError) {
  console.log('ReferenceError');
} catch (e) {
  console.log(e);
}

但目前主流浏览器基本都无法正常运行这种语法的 try … catch 语句,所以不要使用。

如果有类似的需求,可以使用 if 来代替。

try {
  throw 'error';
} catch (e) {
  if (e instanceof TypeError) {
    console.log('TypeError');
  } else if (e instanceof ReferenceError) {
    console.log('ReferenceError');
  } else {
    console.log(e);
  }
}

通过 Error 的构造器可以创建对象。当运行时产生时,Error的实例对象会被抛出。Error 对象也可用于的异常的基础对象。(MDN)

通常在使用 throw 抛出异常时,会抛出 Error 对象的实例。

try {
  throw new Error('主动抛出');
} catch (e) {
  console.error(e);
}

和大部分内置对象一样,Error 实例也可以不使用 new 关键字创建。

try {
  throw Error('主动抛出');
} catch (e) {
  console.error(e);
}

抛出 Error 实例,可以得到出现异常的和对应的行号。

除了 Error ,还有几种预定义好语义的异常对象。

这些异常对象的使用和 Error 几乎一致。

浏览器碰到对应的异常,也会抛出。

try {
    console.log(notDefinedVariable);
} catch (e) {
    console.error(e);
}

因为 notDefinedVariable 并没有定义,所以浏览器会抛出 ReferenceError 异常,同时变量没有定义。

完整的产品业务逻辑流程,基本都要 try ... catch 参与控制,因为出现异常时,还要有对应的动作,如网络请求异常,则重试,或主动进行超时重新请求操作。


联系我
置顶