一。异常处理与错误处理的定义
异常处理:是编程语言或计算机硬件里的一种机制,用于处理软件或信息系统中出现的异常状况(即超出程序正常执行流程的某些特殊条件)
错误处理:是在正常的程序流中,处理不可预见问题的代码,例如一个调用操作未能成功结束
------------------------------百度百科
简单来说,当下面的情况发生的时候:
<!DOCTYPE html>很明显,这是一个错误,是人为的,这是属于我们最常说的错误处理,就是人为的,可预测的,这是属于错误
<html>
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<button onclick="jump()">click me try_catch</button>
<script>
console.log(a);// Uncaught ReferenceError: a is not defined
</script>
</body>
</html>
而当我们的数据库突然连接中断,突然断网等原因导致的,那么这就属于一个异常,一个connetexception
错误处理:
自javascript1.4开始,我们可以在js中使用一个称之为try_catch块的错误处理(或异常处理)
也许人们太喜欢用它了。所以很多代码都可以看到他的声影,
很多人是这么描述它的:
上述代码中,try块中的语句首先被执行。如果运行中发生了错误,控制就会转移到位于catch块中语句,其中括号中的error参数被作为例外变量传递。否则,catch块的语句被跳过不执行。无论是发生错误时catch块中的语句执行完毕,或者没有发生错误try块中的语句执行完毕,最后将执行finally块中的语句。
那么我们也来用一下试试看,首先,我们准备几行代码:
<!DOCTYPE html>看起来,是两个简单的错误,其中,两个都是属于常规的错误,但是,其中一个是属于点击事件内部的,那么有什么区别吗?也许你现在的答案是没有,
<html>
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<button onclick="jump()">click me try_catch</button>
<script>
try {
console.log(a);
console.log("很抱歉,错误1没有被catch到:");
} catch(e) {
console.log("错误1是:");
console.log(e);
}
try {
function jump() {
console.log(b);
console.log("很抱歉,错误2没有被catch到:");
}
} catch(e) {
console.log("错误2是:");
console.log(e);
}
</script>
</body>
</html>
截图如下:(google浏览器测试):
结合代码,看一下:
第一个,最最最最正常的try-catch块,实现了捕抓错误的职能,成功的抓到了第一个错误,
但是第二个却是没有实现捕抓错误的职能
这是因为:
- 没法捕捉到全局的错误事件,也即是只有try,catch的块里边运行出错才会被你捕捉到
是的。没错,trycatch的确存在过,但是,当我们去点击这个按钮的时候,当前的流是属于回调的,是异步的
来个最最经典的回调例子:
<!DOCTYPE html>很自然,结果是什么,不用我多说,也有人说,如果只是加载要执行的代码里面,那就是可以的了。当然,肯定,一定,你说的是对的,我这种转牛角尖的方法,只是很多人会犯的一个基本错误而已
<html>
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<button onclick="jump()">click me try_catch</button>
<script>
try {
console.log("这个是settimeout的");
setTimeout(function(){console.log(a),200})
} catch(e) {
console.log("恭喜你,成功捕抓到了错误");
}
</script>
</body>
</html>
回到本质,实用try-catch的很多情况应该是这样的:
永远应该放在你的控制范围之内,而不应该防范未知的错误。也就是说你很清楚知道这里是有可能”出错“的,而且你很清楚知道什么前提下会出错,你就是要故意利用报错信息来区分错误,后续的程序会解决所有的出错,让程序继续执行。
如:后台返回的数据,有可能是空空如也,有可能是一个数组,或者是一个缺失参数的反馈,而我们写代码的时候,处理最基本的情况就是正常,返回数据的情况下,而try-catch能很轻松的帮助我们去区分他,
说了那么多,到底什么是异常?
最基本的情况,一张图片报错:404,这个是最最常见的异常,为什么?因为我们无法保证服务器会不会boom。
当服务器正常的时候,什么都不会发生,但是当服务器boom的时候,我们的程序也可能会跟着boom,而这是我们无法预测的,就有可能是会报错的一个异常。
图片获取不到?是时候使用我们的onerror函数了。
感觉这位仁兄讲的是最好,最基础的:http://www.w3school.com.cn/js/js_onerror.asp
根据w3c大哥的说法啊,我们做出下面这个demo:来试试:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<button onclick="jump()">click me try_catch</button>
<script>
onerror = function() {
console.log("gg了");
return true; //页面不报错
}
console.log("这个是settimeout的");
setTimeout(function() {
console.log(a), 200
})
</script>
</body>
</html>
效果是如何,大家试试,最后再啰嗦两点:
1.如果需要利用 onerror 事件,就必须创建一个处理错误的函数。你可以把这个函数叫作 onerror 事件处理器 (onerror event handler)。这个事件处理器使用三个参数来调用:msg(错误消息)、url(发生错误的页面的 url)、line(发生错误的代码行)
2.如果需要利用 onerror 事件,最好加载页面最开始。为什么?要是你第一个语句就报错。还让不让后面的代码玩了?