Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

【JavaScript】错误异常与捕获 #58

Open
Tracked by #6
swiftwind0405 opened this issue May 25, 2020 · 0 comments
Open
Tracked by #6

【JavaScript】错误异常与捕获 #58

swiftwind0405 opened this issue May 25, 2020 · 0 comments

Comments

@swiftwind0405
Copy link
Owner

swiftwind0405 commented May 25, 2020

Error

当代码运行时的发生错误,会创建新的Error 对象,并将其抛出。

new Error([message[, fileName[,lineNumber]]])

除了通用的 Error 构造函数外,JavaScript 还有6个其他类型的错误构造函数。

  • EvalError:创建一个 error 实例,表示错误的原因:与 eval() 有关。
  • InternalError : 创建一个代表 Javascript 引擎内部错误的异常抛出的实例。 如: "递归太多".
  • RangeError**`:创建一个 error 实例,表示错误的原因:数值变量或参数超出其有效范围。
  • ReferenceError:创建一个 error 实例,表示错误的原因:无效引用。
  • SyntaxError:创建一个 error 实例,表示错误的原因:eval() 在解析代码的过程中发生的语法错误。
  • TypeError:创建一个 error 实例,表示错误的原因:变量或参数不属于有效类型。
  • URIError:创建一个error实例,表示错误的原因:给 encodeURI()decodeURl() 传递的参数无效。

TypeErrorReferenceError 的区别

ReferenceError 同作用域判别失败相关,而 TypeError 则代表作用域判别成功了,但是对结果的操作是非法或者不合理的。

例如:

var a;
console.log(a.b);

这时会报 Uncaught TypeError: Cannot read property 'b' of undefined,变量 a 存在,但是想要操作的 b 属性不存在。

例如:

console.log(b);

这是会报 Uncaught ReferenceError: b is not defined,这里对 b 进行 RHS查询,在所有嵌套作用域中遍寻不到所需的变量,引擎会抛出
ReferenceError 异常。

throw

throw 语句用来抛出一个用户自定义的异常。当前函数的执行将被停止(throw 之后的语句将不会执行),并且控制将被传递到调用堆栈中的第一个 catch 块。如果调用者函数中没有 catch 块,程序将会终止。

try catch(同步代码异常捕捉)

能被 try catch 捕捉到的异常,必须是在报错的时候,线程执行已经进入 try catch 代码块,且处在 try catch 里面,这个时候才能被捕捉到。
如:

try{
    function d(){a.b;}
   d();
}catch(e){
    console.log("error",e);
}
// output
error ReferenceError: a is not defined

如果是在之前,或者之后,都无法捕捉异常。
之前:

try{
    a.
}catch(e){
    console.log("error",e);
}
// output
Uncaught SyntaxError: Unexpected token '}'

之后:

try {
  setTimeout(() => {
    console.log(a.b);
  }, 100);
} catch (e) {
  console.log("error", e);
}
console.log(111); 
//output
111
Uncaught ReferenceError: a is not defined

Promise 的异常都是由 rejectPromise.prototype.catch 来捕获,不管是同步还是异步。
核心原因是因为 Promise 在执行回调中都用 try catch 包裹起来了,其中所有的异常都被内部捕获到了,并未往上抛异常。因此不要用 try catch 包裹 Promise , Promise 很强大,不用担心异常会往上抛!我们只需要给 Promise 增加 Promise#catch 就可以了。

Promise 错误处理

  • reject('错误信息').then(null, message => {})
  • throw new Error('错误信息').catch(message => {})

推荐使用第二种,更好清晰好读,并且可以捕获前面的错误。

参考资料

@swiftwind0405 swiftwind0405 changed the title 【JavaScript】错误与捕获 【JavaScript】错误异常与捕获 May 25, 2020
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant