Try catch 的用法

try {
  // do some logic here.
} catch(ex) {
  handleException();
  throw exception;
}
复制代码

Try Catch 是否越多越好?

不是。应该尽量少。缘由以下:javascript

  • Try catch 会破坏代码的流畅。打断逻辑流,不美观。
  • 系统级通常对 exception 有统一的处理。好比打 log, 错误率统计等等。一旦 catch 了 log 又没有正确抛出的话,就没有统一的处理。
  • 因此应该尽量的交给底层平台去处理 exception. 这样代码既美观,error 也能有统一的处理。并且也能让 app 及时在出错的地方停下来。

常见的错误:java

  • 没有正确抛出 exception,致使 exception 丢失。(除非你知道本身在干什么,下面有腻子)。
try {
// some logic
} catch(ex) {
  console.log(ex);
}
复制代码
  • 抛出 exception, 可是修改 exception 致使信息丢失。
try {
// some logic
} catch(ex) {
  throw new Error('There is some error occurs!');
}
复制代码
  • 无心义的 catch
try {
// some logic
} catch(ex) {
  throw ex;
}
复制代码

何时须要写 try catch? (假设系统级已经有比较完善的 exception 处理。)

  • 须要忽略出现的 exception。
function isJsonString(str) {
  try {
    JSON.parse(str);
    return true;
  } catch() { 
    return false;
  }
}
复制代码
  • 须要细化 exception 或者 customize exception. (千万不要粗化 exception, 如上面 new Error 的例子)
function loadUser(id) {
  try {
    await userModel.get(id);
  } catch(ex) {
    throw new UnauthorizedError(`${}`); // (不太贴切,有没有更好的腻子)
  }
}
复制代码

如何正确处理 catch 到的 exception? (上面多数都提到了,再总结一次)

  • 保证 exception 在底层已经处理。(若是没有,是时候写点更底层的代码了)
  • 永远不要吃掉 exception. 除非你知道本身在作什么。
  • 尽量不要让 catch 到的 exception 表述的信息更加模糊,应该是更加精准。除非你知道本身在作什么。
  • 尽量不要作无心义的 try catch, catch it and just throw it. 除非你知道本身要作什么。
  • 尽量少写 try catch.
  • 尽量让 catch 中的逻辑简单。以下面的例子,catch 中有复杂的操做,容易 throw exception. (不要把 try catch 当 if else 用)
function loadUser(id, email) {
  try {
    await userModel.getById(id);
  } catch(ex) {
    await userModel.getByEmail(email);
  }
}
复制代码

何时应该 throw exception?

勇敢的 throw exception, 谨慎的 catch exception. 在方法设计中,应该尽量用 throw 替代状态返回值。bash

// return true is saved return false if not saved
function saveUser(user) {
  // save user to database
}
复制代码

True 和 False 是没法预见全部状况的,若是 return false, 咱们没法知道到底出了什么错。 Catch exception not saved. No exception saved. 这样你也能够只关心正确的逻辑,若是没有 save 成功自动跳出。app

JS 中有那哪些常见的坑?

最大的问题,JS 是异步的。异步

  • 永远没法 catch 到异步的 error.
try {
  setTimeout(()=> {
    throw new Error('Can you catch me?');
  }, 0);
} catch(ex) { 
// catch 不到 
}
复制代码
function loadUser(id) {
  try {
    userModel.get(id);
  } catch(ex) { 
    // catch 不到
  }
}
复制代码
try {
  users.forEach(async (user) => {
    await userModel.save(user);
  });
} catch(ex) {
  // catch 不到
}
复制代码

总结成一句话就是:全部的异步操做都须要 await 之后才能 try catch。除非你知道,本身在作什么。async

相关文章
相关标签/搜索