第十七章 错误处理与调试

323 阅读2分钟

错误处理

try - catch 语句

如果 try 块中的任何代码发生了错误,就会立即退出代码执行过程,然后接着执行 catch 块。此时,catch 块会接收到一个包含错误信息的对象。这个对象保存着错误消息的 message 属性,以及保存错误类型的 name 属性

try { 
  	window.someNonexistentFunction(); 
} catch (error){ 
  	alert(error.message); 
} 
  1. finally 语句

    只要代码中包含 finally 子句,则无论 try 或 catch 语句块中包含什么代码——甚至 return 语句,都不会阻止 finally 子句的执行。如果提供 finally 子句,则 catch 子句就成了可选的(catch 或 finally 有一个即可)。

    //返回的是 0
    function testFinally(){ 
      	try { 
      		return 2; 
      	} catch (error){ 
      		return 1; 
      	} finally { 
      		return 0; 
      	} 
    } 
    
  2. 错误类型

    • Error:基类型,其他错误类型都继承自该类型
    • EvalError:使用 eval() 函数发生异常时被抛出
    • RangeError:在数值超出相应范围时触发
    • ReferenceError:在找不到对象的时候发生该错误(object expected),通常在访问不到变量的时候发生这种错误
    • SyntaxError:语法错误,当语法错误的 js 字符串传入 eval() 函数时会触发该错误
    • TypeError:在变量中保存着意外的类型时,或者在访问不存在的方法时,会导致这种错误
    • URIError:在使用 encodeURI() 或 decodeURI() ,而 URI 格式不正确时,就会导致该错误

    可以在 try-catch 语句的 catch 语句中使用 instanceof 操作符确定错误的类型

    new eval();//抛出 evalError
    eval = foo;//抛出 evalError
    
    var a = new Array(-20);//抛出 RangeError
    var b = new Array(Number.MAX_VALUE);//抛出 RangeError
    
    var obj = x;//在 x 未声明的情况下抛出 ReferenceError
    
    eval("a ++ b");//抛出 SyntaxError
    
    var o = new 10;//抛出 TypeError
    alert("name" in true);//抛出 TypeError
    Function.prototype.toString.call("name");//抛出 TypeError
    
    try{
        doSomething();
    }catch(error){
        if(error instanceof TypeError){
            //处理类型错误
        }else if(error instanceof ReferenceError){
            //处理引用错误
        }else{
            //处理其他类型错误
        }
    }
    

抛出错误

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

错误事件

任何没有通过 try-catch 处理的错误都会触发 window 对象的 error 事件。onerror 事件处理程序都不会创建 event 对象,但是可以接收三个参数:错误消息、错误所在的 URL 和行号。可以通过在事件处理程序中返回false,阻止浏览器报告错误的默认行为

window.onerror = function(message, url, line){ 
  	alert(message); 
  	return false; 
}; 

调试技术