前端异常捕获与错误处理

throw

使用throw语句抛出一个异常

  • 可以抛出任意表达式

    1
    2
    3
    throw 'Error2';   // String type
    throw 42; // Number type
    throw true; // Boolean type
  • 可以在抛出异常时声明一个对象,那你就可以在catch块中查询到对象的属性。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    1.
    throw {
    toString: function() {
    return 'I'm an object!';
    }
    };
    2.
    function UserException (message){
    ...
    }
    throw new UserException('Value too high');

作用范围就是阻断一个 script 标签内的程序运行,但是不会影响下面的 script。

try…catch

try…catch 语句有一个包含一条或者多条语句的try代码块,0个或多个的catch代码块,catch代码块中的语句会在try代码块中抛出异常时执行。finally 代码块总会紧跟在try和catch代码块之后执行。

  • 用try块来执行代码,抛出异常。
  • 用catch块来处理所有可能在try块中产生的异常。
  • 用finally块来令你的脚本在异常发生时优雅地退出。

    如果finally块返回一个值,该值会是整个try-catch-finally流程的返回值。

Error对象

name:错误名称
message:错误提示信息
stack:错误的堆栈(非标准属性,但是大多数平台支持)

Error对象是最一般的错误类型,在它的基础上,JavaScript还定义了其他6种错误,也就是说,存在Error的6个派生对象。

1、SyntaxError //解析代码时发生的语法错误
2、ReferenceError //引用一个不存在的变量时发生的错误
3、RangeError //当一个值超出有效范围时发生的错误
4、TypeError //变量或参数不是预期类型时发生的错误
5、URIError //URI相关函数的参数不正确时抛出的错误
6、EvalError //eval函数没有被正确执行时,会抛出EvalError错误

可以自定义Error对象

异步函数的异常捕获

  • 常见的异步模型

1 高阶函数(泛函数)
把函数作为参数送入,然后回调。
2 事件监听
3 发布/订阅( Pub/Sub )
4 Promise 对象

某个函数会导致将来再运行的另一个函数,后者取自于事件队列(若后面这个函数是作为参数传递给前者的,则称其为回调函数,简称为回调)。

try/catch无法捕捉异步回调里的异常,无法捕捉到语法错误,也没法去捕捉全局的异常事件。

因为异步函数的回调是在事件队列里单独拉出来执行的。所以在异步函数外面包裹try-catch是无法捕捉到回调函数里抛出的异常的。因为当回调函数从队列里被拉出来执行的时候try-catch所在的代码块已经执行完毕了。

当回调里的异常被抛出但没被捕获的时候,该异常会直接被主程序所捕获。在浏览器里可以通过window.onerror,在node里通过process.uncaughtException可以捕获此类异常。

  • Promise不需要使用try…catch,直接使用.catch()
  • Generator 可以直接使用co 函数库来使用try…catch
  • async 和 await 可以直接使用try…catch
分享到:
Disqus 加载中...

如果长时间无法加载,请针对 disq.us | disquscdn.com | disqus.com 启用代理