异常胜于返回码

  1. class Num {
  2. setNum(num) {
  3. if (typeof num !== 'number') {
  4. return 'NOT A NUMBER';
  5. }
  6. if (num < 0) {
  7. return 'LESS THAN ZERO';
  8. }
  9. this.num = num;
  10. }
  11. }
  12. let num = new Num();
  13. let error = num.setNum(5);
  14. if (error !== 'LESS THAN ZERO' && error !== 'NOT A NUMBER') {
  15. console.log(num.num);
  16. }

这样写非常麻烦

  1. 要返回所有错误码
  2. 要检查所有错误码

    引出异常胜于返回码

    用抛出异常代替返回码 ```javascript class Num { setNum(num) {
    1. if (typeof num !== 'number') {
    2. throw Error('NOT A NUMBER');
    3. }
    4. if (num < 0) {
    5. throw Error('LESS THAN ZERO');
    6. }
    7. this.num = num;
    } }

let num = new Num(); try { num.setNum(5); console.log(num.num); } catch (error) { console.log(error); }

  1. 通过将要远行的代码包装try块中,无需检查所有错误码。捕获错误而不用检查可能返回的所有错误代码。
  2. <a name="us7kL"></a>
  3. # 别忘记处理捕获到的错误
  4. catch块中直接打error打印出来而不作任何处理,这样做是没有任何意义。
  5. - 发现错误不应该忽视
  6. - 报告异常会让我们知道该错误,然后相应进行处理
  7. ```javascript
  8. try {
  9. num.setNum(5);
  10. console.log(num.num);
  11. } catch (error) {
  12. console.log(error);
  13. display(error); // 在UI界面有所显示
  14. reportToService(error); // 上报给服务器给予记录,以作后续处理
  15. }

同样对于Promise的异常也是同样地处理。

  1. getData()
  2. .then(data => {
  3. ...
  4. })
  5. .catch(error => {
  6. console.log(error);
  7. display(error); // 在UI界面有所显示
  8. reportToService(error); // 上报给服务器给予记录,以作后续处理
  9. });