【红宝书】第17章错误处理与调试

IE、Firefox、Safari、Chrome、Opera等主流浏览器都具有某种向用户报告JS错误的机制。默认情况下,所有浏览器都会隐藏此类信息。

错误处理

良好的错误处理机制可以让用户及时得到提醒。

try-catch语句

			try{
				// 可能会导致错误的代码
			}catch(e){
				// 在错误发生时怎么处理
alert(error.message) // 错误消息
                                alert(error.name)  // 错误类型
			}

try块中的任何代码发生错误,就会立即退出代码执行过程,然后接着执行catch块。此时,catch块会接收到一个包含错误信息的对象。

这个对象包含的实际信息会因浏览器而异,但共同的是有一个保存着错误消息的message属性,还规定了一个保存错误类型的name属性。

1.finally子句

只要代码块包含finally子句,则无论try或catch语句块中包含什么代码(甚至return语句),都不会阻止finally子句的执行。

			function testFinally() {
				try {
					return 2
				} catch (error) {
					return 1
				} finally {
					return 0
				}
			}

 上述函数无论如何都只返回0

2.错误类型

Error:基类型,其他错误类型都继承自该类型。很少见,如果有也是浏览器抛出。这个基类型的主要目的是供开发人员跑出自定义错误。

EvalError:会在使用eval()函数而发生异常时抛出。如果没有将eval()当成函数调用则抛出。

范围错误RangeError:数值超出相应范围时触发。如指定数组项数为不支持的项数-20或Number.Max_VALUE

let item = new Array(-20)

引用错误ReferenceError:找不到对象的情况下,比如访问不存在的变量

var obj = x // x未声明

语法错误SyntaxError:语法错误的js字符串传入eval()函数。如果语法错误的代码出现在eval()函数外则会导致js代码立即停止执行。

eval("a++"b)

类型错误TypeError:变量中保存意外的类型或者在访问不存在的方法。归根结底还是由于执行特定于类型的操作时,变量的类型并不符合要求所致。

let obj = new 10

URI错误URIError:encodeURI()或decodeURI()

利用不同的错误类型可以获悉更多有关异常的信息,从而有助于对错误做出恰当的处理。

			try {
				// doSomething
			} catch (error) {
				if(error instanceof TypeError){
					// 处理类型错误
				}else if(error instanceof ReferenceError){
					// 处理引用错误
				}else{
					// 处理其他错误
				}
			}

3.合理使用try-catch

适合处理哪些我们无法控制的错误比如使用第三方库中的函数,而该函数可能会抛出错误,而我们无法修改库的源代码,因此捕获错误有错误发生进行恰当处理。

抛出错误throw

throw操作符用于抛出自定义错误。在遇到throw操作符时,代码会立即停止执行。仅当有try-catch语句捕获到被抛出的值时,代码才会继续执行

猜你喜欢

转载自www.cnblogs.com/Mijiujs/p/12192179.html