We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
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
当代码运行时的发生错误,会创建新的Error 对象,并将其抛出。
new Error([message[, fileName[,lineNumber]]])
除了通用的 Error 构造函数外,JavaScript 还有6个其他类型的错误构造函数。
EvalError
eval()
InternalError
RangeError
ReferenceError
SyntaxError
TypeError
URIError
encodeURI()
decodeURl()
ReferenceError 同作用域判别失败相关,而 TypeError 则代表作用域判别成功了,但是对结果的操作是非法或者不合理的。
例如:
var a; console.log(a.b);
这时会报 Uncaught TypeError: Cannot read property 'b' of undefined,变量 a 存在,但是想要操作的 b 属性不存在。
Uncaught TypeError: Cannot read property 'b' of undefined
a
b
console.log(b);
这是会报 Uncaught ReferenceError: b is not defined,这里对 b 进行 RHS查询,在所有嵌套作用域中遍寻不到所需的变量,引擎会抛出 ReferenceError 异常。
Uncaught ReferenceError: b is not defined
RHS
throw 语句用来抛出一个用户自定义的异常。当前函数的执行将被停止(throw 之后的语句将不会执行),并且控制将被传递到调用堆栈中的第一个 catch 块。如果调用者函数中没有 catch 块,程序将会终止。
throw
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 的异常都是由 reject 和 Promise.prototype.catch 来捕获,不管是同步还是异步。 核心原因是因为 Promise 在执行回调中都用 try catch 包裹起来了,其中所有的异常都被内部捕获到了,并未往上抛异常。因此不要用 try catch 包裹 Promise , Promise 很强大,不用担心异常会往上抛!我们只需要给 Promise 增加 Promise#catch 就可以了。
Promise
reject
Promise.prototype.catch
Promise#catch
reject('错误信息').then(null, message => {})
throw new Error('错误信息').catch(message => {})
推荐使用第二种,更好清晰好读,并且可以捕获前面的错误。
The text was updated successfully, but these errors were encountered:
No branches or pull requests
Error
当代码运行时的发生错误,会创建新的Error 对象,并将其抛出。
除了通用的 Error 构造函数外,JavaScript 还有6个其他类型的错误构造函数。
EvalError
:创建一个 error 实例,表示错误的原因:与eval()
有关。InternalError
: 创建一个代表 Javascript 引擎内部错误的异常抛出的实例。 如: "递归太多".RangeError
**`:创建一个 error 实例,表示错误的原因:数值变量或参数超出其有效范围。ReferenceError
:创建一个 error 实例,表示错误的原因:无效引用。SyntaxError
:创建一个 error 实例,表示错误的原因:eval()
在解析代码的过程中发生的语法错误。TypeError
:创建一个 error 实例,表示错误的原因:变量或参数不属于有效类型。URIError
:创建一个error实例,表示错误的原因:给encodeURI()
或decodeURl()
传递的参数无效。TypeError
和ReferenceError
的区别ReferenceError
同作用域判别失败相关,而TypeError
则代表作用域判别成功了,但是对结果的操作是非法或者不合理的。例如:
这时会报
Uncaught TypeError: Cannot read property 'b' of undefined
,变量a
存在,但是想要操作的b
属性不存在。例如:
这是会报
Uncaught ReferenceError: b is not defined
,这里对b
进行RHS
查询,在所有嵌套作用域中遍寻不到所需的变量,引擎会抛出ReferenceError
异常。throw
throw
语句用来抛出一个用户自定义的异常。当前函数的执行将被停止(throw
之后的语句将不会执行),并且控制将被传递到调用堆栈中的第一个catch
块。如果调用者函数中没有catch
块,程序将会终止。try catch(同步代码异常捕捉)
能被
try catch
捕捉到的异常,必须是在报错的时候,线程执行已经进入try catch
代码块,且处在try catch
里面,这个时候才能被捕捉到。如:
如果是在之前,或者之后,都无法捕捉异常。
之前:
之后:
Promise
的异常都是由reject
和Promise.prototype.catch
来捕获,不管是同步还是异步。核心原因是因为
Promise
在执行回调中都用try catch
包裹起来了,其中所有的异常都被内部捕获到了,并未往上抛异常。因此不要用try catch
包裹Promise
,Promise
很强大,不用担心异常会往上抛!我们只需要给Promise
增加Promise#catch
就可以了。Promise 错误处理
reject('错误信息').then(null, message => {})
throw new Error('错误信息').catch(message => {})
推荐使用第二种,更好清晰好读,并且可以捕获前面的错误。
参考资料
The text was updated successfully, but these errors were encountered: