您的位置:首页 > Web前端 > JavaScript

JavaScript 异常处理

2020-08-13 16:35 1021 查看

程序异常

  程序异常可分为逻辑异常和语法异常,对于初学者而言语法异常居多,随着不断的学习对语言越来越熟悉后语法异常减少逻辑异常增多。

  在

JavaScript
中提供了对异常进行处理的语句,在适当的时候使用它们能够使程序变得更加健壮。

  但是要注意不要滥用异常处理,它会使程序的可读性变差。

异常对象

  所有的异常都是对象

异常类型

  在

JavaScript
中,常见异常类型有以下几种。

异常类型简述
Error
Error
是最基本的错误类型,其他的错误类型都继承自该类型。因此,
所有错误的类型共享了一组相同的属性。
这个类型的错误很少见。一般使用开发人员自定义抛出的错误
EvalError 这个错误会在使用
eval()
函数发生异常时候抛出。两种情况会出错:1.使用
new
来进行实例化 2.尝试为变量起名为
eval
,因为它是一个关键字,所以这是不被允许的
RangeError 数值超出范围,常见于
Array
操作中
ReferenceError 变量找不到
SyntaxError 语法错误
TypeError 类型错误
URIError 在使用
encodeURI
或者
decodeURI
因为URL格式不正确时,就会导致URIError错误。

异常捕获

try catch

  使用

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
原型对象,可配置自定义的异常。

  Error
构造函数具有
message
可选参数,用于显示人类可阅读的错误描述信息

函数形式

<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.nam
1088
e);  // MyError
console.log(e.message);  // Default Message
}

try {
throw new MyError("自定义异常被抛出");
} catch (e) {
console.log(e.name);  // MyError
console.log(e.message);  // 自定义异常被抛出
}

</script>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: