程序异常
程序异常可分为逻辑异常和语法异常,对于初学者而言语法异常居多,随着不断的学习对语言越来越熟悉后语法异常减少逻辑异常增多。
在JavaScript
中提供了对异常进行处理的语句,在适当的时候使用它们能够使程序变得更加健壮。
但是要注意不要滥用异常处理,它会使程序的可读性变差。
异常对象
所有的异常都是对象
异常类型
在JavaScript
中,常见异常类型有以下几种。
异常捕获
try catch
使用try
与catch
语句进行捕获异常。
try...catch
语句有一个包含一条或者多条语句的try
代码块,0个或1个的catch
代码块,catch
代码块中的语句会在try
代码块中抛出异常时执行。
如果try
代码块中的语句(或者try
代码块中调用的方法)一旦抛出了异常,那么执行流程会立即进入catch
代码块。
如果try
代码块没有抛出异常,catch
代码块就会被跳过。
<script>
"use strict";
try {
console.log(username);
} catch (e) { // 会捕获异常的所有信息
console.log("处理了一个异常:", e);
}
/*
处理了一个异常: ReferenceError: username is not defined
at 1.html:56
*/
</script>
finally
finally
块包含了在try
和catch
块完成后、下面接着try...catch
的语句之前执行的语句。
finally
块无论是否抛出异常都会执行。如果抛出了一个异常,就算没有异常处理,finally
块里的语句也会执行。
<script>
"use strict";
try {
console.log(username);
} catch (e) { // 会捕获异常的所有信息
console.log("处理了一个异常,ID:", e);
} finally {
console.log("无论有没有异常都会执行我");
}
</script>
主动异常
throw
在某些时候我们需要主动抛出异常,使用throw
语句抛出异常。
<script>
"use strict";
throw new Error("这是一个错误")
</script>
表达式形式
你可以抛出任意表达式而不是特定一种类型的表达式。下面的代码抛出了几个不同类型的表达式:
<script>
"use strict";
throw "Error2"; // String type
throw 42; // Number type
throw true; // Boolean type
throw { toString: function () { return "I'm an object!"; } };
</script>
自定义异常
继承Error
原型对象,可配置自定义的异常。
函数形式
<script>
"use strict";
function MyError(message) {
this.name = 'MyError';
this.message = message || 'Default Message';
this.stack = (new Error()).stack;
}
Object.setPrototypeOf(MyError, Error); // 继承Error原型对象
try {
throw new MyError();
} catch (e) {
console.log(e.name); // MyError
console.log(e.message); // Default Message
}
try {
throw new MyError("自定义异常被抛出");
} catch (e) {
console.log(e.name); // MyError
console.log(e.message); // 自定义异常被抛出
}
</script>
类形式
<script>
"use strict";
class MyError extends Error {
constructor(message) {
super();
this.name = "MyError";
this.message = message || 'Default Message';
this.stack = (new Error()).stack;
}
}
try {
throw new MyError();
} catch (e) {
console.log(e.name); // MyError
console.log(e.message); // Default Message
}
try {
throw new MyError("自定义异常被抛出");
} catch (e) {
console.log(e.name); // MyError
console.log(e.message); // 自定义异常被抛出
}
</script>