这是我参与8月更文挑战的第2天,活动详情查看:8月更文挑战
工欲善其事,必先利其器
先来了解下throw
throw语句用来抛出一个用户自定义的异常。throw之后的语句将不会被执行。- 并且控制将被传递到调用栈中的第一个catch块。
- 如果调用者函数中没有catch块,程序将会终止。
function getRectArea(width, height) {
if (isNaN(width) || isNaN(height)) {
throw 'Parameter is not a number!';
}
}
try {
getRectArea(3, 'A');
} catch (e) {
console.error(e);
}
throw 用法
- throw 后面可以跟 基本类型的数据,表示要抛出的异常的内容。
throw "Error2"; // 抛出了一个值为字符串的异常
throw 42; // 抛出了一个值为整数42的异常
throw true; // 抛出了一个值为true的异常
- 抛出一个对象
try {
throw new Error('抛出的异常对象')
} catch (error){
console.log(error, '此处变量error就是接收到的抛出的异常对象')
}
try catch 认知
-
try语句包含了由一个或者多个语句组成的try块, 和至少一个catch块或者一个finally块的其中一个,或者两个兼有, 下面是三种形式的try声明:try ... catchtry ... finallytry ... catch ... finally
-
catch块中的代码意味着,try块中有任何一个语句(或者从try块中调用的函数)抛出异常,就会执行。 如果在try块中没有异常抛出,则会跳过catch块。 -
finally在try块和catch块之后执行,但是会在下一个try声明之前执行。 -
无论是否有异常抛出或捕获,
finally总是会执行。
catch
- catch块指定一个标识符,保存由throw语句指定的值。
catch块是唯一的,因为当输入catch块,js会创建此标识符,并将其添加到当前作用域。- 标识符仅在catch块执行时存在,catch块执行完成后,标识符不在可用。
- 该标识符可以用来获取关于被抛出异常的信息。
try {
throw new Error('出错啦')
} catch (error) {
// 此处的error就是catch块的标识符
console.log(error)
}
- 任何给定的异常 只 会在离它
最近的封闭catch块捕获一次。
finally
无论是否抛出异常,finally块总是会执行。当try catch块中有return语句时,finally中的代码依然会被执行。- 如果从finally块中返回一个值,那么这个值将会成为整个try-catch-finally的返回值,无论是否有return语句在try和catch块中。
关于异常捕获
try catch 无法捕捉异步的异常。- 准确的说是,能捕捉到的异常必须是线程执行已经进入try catch,但是 try catch并未执行完的时候。
- 例如:语法报错,此时代码执行并未进入 try catch,那么无法捕获异常
try {
a.
} catch(err) {
console.log('error', err)
}
// 将这段代码输入浏览器控制台。会得到下面的错误
// Uncaught SyntaxError: Unexpected token '}'
通俗的讲,你的代码都没写对,怎么能给你捕获到异常呢???