js 错误
try catch finally是javascript语言提供的异常处理机制。
try catch finally是javascript语言提供的异常处理机制。
此语法中除了try以外catch和finally都是可选的(两者必须要有一个)
1、try-catch
捕获异常语句:
为了让程序能正常运行,你可以把你认为有可能出错的代码片放到try里面;
try执行到错误语句,会终止执行该语句的下一行,此时会把错误信息打包到Error对象并抛出;
错误信息被catch捕捉到,避免输出到控制台阻止下面的程序正常执行;
catch里面可以执行任意的提示语句,但一般是打印出错误信息与提示,如果程序没有错误,则不会执行catch。
在catch出现错误仍然会报错,若是没有被捕获,会终止后面的代码运行。
try{
console.log("a");
console.log(b); //错误,终止执行
console.log(c);
}catch(e){
console.log(e.name + ':' + e.message); // ReferenceError:b is not defined
}
console.log('d'); // 不会影响这行代码执行
在try-catch外面再套一层try-catch,外层的catch就可以捕获内层catch中的错误信息,从而不影响后面的代码执行。
try{
try{
console.log("a");
console.log(b); //错误,终止执行
console.log(c);
}catch(e){
console.log(e.name + ':' + e.message); // ReferenceError:b is not defined
console.log(d); //错误,终止执行
console.log("e");
}
}catch(e){
console.log(e.name + ':' + e.message); //捕获内层catch中的错误信息
}
console.log('d'); //不受影响,正常执行
换句话说try-catch语句可用于容错,由于浏览器兼容性问题,以及前后端交互过程中一些意外因素如网络异常,数据传送时间误差,导致一些变量会报错。由于不同浏览器的报错提示是不一样的,根据捕获的浏览器的报错提示判断用户的浏览器,然后做出对应的措施。if通常只能反馈真或假,不能直接反馈浏览器的报错内容。
try-catch不能做真假判断,只能做非法判断。也就是说:try {1 === 2},虽然1===2是假,但是是合法的,catch不会捕捉到错误,也不会告诉你1 === 2到底是真是假。而if{1 === 2}会直接报错,终止运行。
try{
1 === 2; // 合法
}catch(e){
console.log(e.name + ':' + e.message); // 不执行
}
try{
window.a.b == 1; // 非法
}catch(e){
console.log(e.name + ':' + e.message); // 执行
}
console.log("a");
if(window.a.b == 1){ // 非法,程序终止运行
console.log("error");
}
console.log("b"); //无法执行
2、finally
不管try代码块的执行是如何被终止的(出现异常、return、自然终止)finally中的语句始终会被执行,正是由于finally的这种特性,通常finally用来执行一些清理工作。如果try中代码是以return,continue,break的方式终止的,Javascript引擎会在执行完finally中的语句以后再执行相应的try中的返回语句。
try{
throw new Error('出错了……');
console.log('此行不会执行');
}finally {
console.log('完成清理工作');
}
以下是几种try-catch-finally的嵌套形式,对比输出顺序。
// ex1:
try{
try{
throw new Error("a");
}
finally{
console.log('finally');
}
}catch(e){
console.log(e.message);
}
// finally
// a
//ex2:
try{
try{
throw new Error("a");
}
catch(e){
console.log("inner",e.message);
}
finally{
console.log('finally');
}
}catch(e){
console.log("outer",e.message);
}
// a
// finally
//ex3:
try{
try{
console.log(a);
}
catch(e){
console.log(e.message); // a is not defined
console.log(b);
}
finally{
console.log('finally'); // finally
console.log(c);
}
}catch(e){
console.log(e.message); //c is not defined, catch和finally同时有错,只捕捉finally里的错误
}
3、throw
throw
语句的作用是手动中断程序执行,抛出一个错误。
有些JavaScript代码并没有语法上的错误,但是又逻辑错误,对于这种错误,JavaScript不会抛出异常,这时候需要我们自己定义一个Error对象的实例,并使用throw语句来抛出异常。在程序中我们可以通过使用throw语句有目的地抛出异常,语法格式:throw new Error('somestatements');
手工抛出异常的方法如下:
try{
throw new Error("Whoops!");
}catch (e) {
alert(e.name + ": " + e.message);
}
实际上,throw
可以抛出任何类型的值。也就是说,它的参数可以是任何值。
try {
throw new Date(); // 抛出当前时间对象
} catch (e) {
alert(e.toLocaleString()); // 使用本地格式显示当前时间
}
本例检测输入变量的值。如果值是错误的,会抛出一个异常(错误)。catch 会捕捉到这个错误,并显示一段自定义的错误消息:
<!DOCTYPE html>
<html>
<body>
<script>
function myFunction(){
try{
var x=document.getElementById("demo").value;
if(x=="") throw "值为空";
if(isNaN(x)) throw "不是数字";
if(x>10) throw "太大";
if(x<5) throw "太小";
}catch(err){
var y=document.getElementById("mess");
y.innerHTML="错误:" + err + "。";
}
}
</script>
<p>请输入 5 到 10 之间的数字:</p>
<input id="demo" type="text">
<button type="button" onclick="myFunction()">测试输入值</button>
<p id="mess"></p>
</body>
</html>
4、Error
1、Error
实例对象
try...catch...finally语句中的catch通常捕捉到的对象为Error对象,JavaScript解析或运行时,一旦发生错误,引擎就会抛出一个错误对象。
Error对象有以下两个属性:
name:表示异常类型的字符串
message:实际的错误信息
2、六种错误对象
Error
实例对象是最一般的错误类型,在它的基础上,JavaScript还定义了其他6种错误对象。也就是说,存在Error
的6个派生对象。--
SyntaxError
解析代码时发生的语法错误。
ReferenceError
引用非法或无法识别的变量时或将一个值分配给无法分配的对象。
RangeError
一个值超出有效范围时发生的错误,如数组长度为负数。
TypeError
变量或参数不是预期类型时发生的错误。
URIError
URI 相关函数的参数不正确时抛出的错误
EvalError eval()的使用与定义不一致,该错误类型已经不再使用了,只是为了保证与以前代码兼容,才继续保留。