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语句捕获到被抛出的值时,代码才会继续执行