# JavaScript教程 - 18 异常处理

# 18.1 异常

JavaScript 已经是比较”宽容“的语言了,有一些情况,搁其他语言早就报错了,但是 JavaScript 还能运行,因为 JavaScript 在设计的时候,设计思想就是能不报错就不报错。

但是也不是所有情况 JavaScript 都不报错,有些时候程序确实是无法继续执行的,不得不报错并终止执行,我们可以对这些可能出现的错误情况进行预处理,防止程序崩溃或者给用户一些提示,这样可以增强代码的健壮性和提升用户体验。


举个栗子,有下面的代码,执行的时候会报错:

let obj = null;
console.log(obj.name);
1
2

上面的代码会报错,错误会在浏览器控制台打印:

# 18.2 异常处理

异常处理的语法结构:

try {
  // 可能出错的代码
} catch (error) {
  // 捕获异常后的处理逻辑
} finally {
  // (可选)无论是否出错都会执行
}
1
2
3
4
5
6
7
  • 将可能报错的代码放到 try 块中;
  • 如果代码运行出现异常,会被 catch 块捕获,并执行 catch 块中的代码;
  • 无论代码是否出错,finally 块的代码都会执行,finally 块可以省略

举个栗子:

try {
  // 可能出错的代码
  let obj = null;
  console.log(obj.name); // TypeError
  
  console.log(123);  // 无法执行
} catch (error) {
  console.log("出错了:" + error);
} finally {
  console.log("总会执行的代码,如清理资源");
}

console.log(456);  // 可以执行
1
2
3
4
5
6
7
8
9
10
11
12
13
  • 当 try 块中的代码出现异常,那么 try 块中出现异常的代码之后的代码,是无法执行的,所以上面是无法打印 123 的。
  • 出现异常,会被 catch 块捕获,异常信息会被封装到 error (名称可自定义)对象中。
  • 无论是否出现异常,finally 块的代码都会执行,如果需要,可以添加 finally 块,不需要可以省略;
  • 因为异常被捕获了,所以之后的代码是可以继续执行的,所以会打印 456
  • 注意:非常不建议 catch 块中什么代码也不写,这样出现异常,程序没有成功执行,还没有任何日志,不容易定位错误。所以最起码打印一下日志。

上面的代码执行结果如下:

出错了:Cannot read properties of null (reading 'name')
总会执行的代码,如清理资源
456
1
2
3

# 18.3 打印错误信息

错误信息会被封装到异常对象中,可以通过如下信息打印异常信息:

try {
  console.log(obj.name); // TypeError
} catch (error) {
  console.log(error);  // 1. 打印完整信息
  console.error(error);  // 2. 打印完整信息,红色更显眼
  console.log("出错了:" + error)  // 3. 打印简短的信息,包括类型和错误信息
  console.log(e.message); // 4. 只输出错误信息
  console.log(e.name);  // 5. 打印错误类型
  console.log(e.stack);  // 6. 打印调用栈信息
}

// ----打印信息如下:
// 1
ReferenceError: obj is not defined
    at index.html:10:21

// 2
index.html:13 ReferenceError: obj is not defined
    at index.html:10:21
(匿名)	@	index.html:13

// 3
出错了:ReferenceError: obj is not defined

// 4
出错了:obj is not defined

// 1
ReferenceError: obj is not defined
    at index.html:10:21

// 2
index.html:13 ReferenceError: obj is not defined
    at index.html:10:21
(匿名) @ index.html:13

// 3
出错了:ReferenceError: obj is not defined

// 4
obj is not defined

// 5
ReferenceError

// 6
ReferenceError: obj is not defined
    at index.html:10:21
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
  • 可以根据需要打印,开发时可以打印详细一些,将堆栈信息打印出来,例如查找错误。
内容未完......