ES3开始引入了 try-catch 语句,是 JavaScript 中处理异常的标准方式。
语法:
try{
?
//可能发生异常的代码?}catch(error){
?
//发生错误执行的代码?}
看下面的代码:
<script>
try{
console.log(b);
console.log("我不会输出的,不要找了")
}catch(error){
console.log("发生错误了")
}
console.log("我try catch后面的代码")
</script>
说明:
console.log(b);
这行代码会出错,则立即去执行catch中的代码。所以console.log("我不会输出的,不要找了")
这行代码则不会再执行在 try…catch 中,try 中一旦出现错误则其他语句不能执行,如果不出现错误则 catch 中的语句不会执行。
Javascript 参考其他编程语言,也提供了一种 finally 语句:不管 try 中的语句有没有错误,在最后都会执行 finally 中的语句。
即:try 中语句不发生错误执行完毕后会执行 finally 中的语句,try 中的语句发生错误,则执行 catch中的语句,catch 中的语句执行完毕后也会执行 finally 中的语句。
语法:
try{
}catch(error){
}finally{
}
<script>
try{
console.log(b);
console.log("我不会输出的,不要找了")
}catch(error){
console.log("发生错误了")
}finally {
console.log("不管发生不发生错误,我都会执行")
}
console.log("我try catch后面的代码")
</script>
所以在 finally 中我们可以放置我们必须要执行的代码。
注意:
<script>
try{
console.log(b);
console.log("我不会输出的,不要找了")
}finally {
console.log("不管发生不发生错误,我都会执行")
}
console.log("我try catch后面的代码")
</script>
执行代码期间可能会发生的错误有多种类型。每种错误都有对应的错误类型,而当错误发生时,就 会抛出相应类型的错误对象。js共定义了下列 7 种错误类型:
说明:
try {
someFunction();
} catch (error){
if (error instanceof TypeError){
//处理?类型错误
} else if (error instanceof ReferenceError){
//处理引用错误
} else {
//处理其他的错误
}
}
? 当 try-catch 语句中发生错误时,浏览器会认为错误已经被处理了,浏览器就不再报告错误了。这也是最简单的一种情况。
? 使用 try-catch 最适合处理那些我们无法控制的错误。假设你在使用一个大型 JavaScript 库中的 函数,该函数可能会有意无意地抛出一些错误。由于我们不能修改这个库的源代码,所以大可将对该函 数的调用放在 try-catch 语句当中,一有什么错误发生,也好可以恰当地处理它们。
? 在明明知道自己的代码会发生错误时,再使用 try-catch 语句就不太合适了。例如,如果 传给函数的参数是字符串而非数值,就会造成函数出错,那么就应该先检查参数的类型,然后再决定 如何去做。在这种情况下,不应用使用 try-catch 语句。因为try…catch语句比较是比较好资源的事情。
? 在大部分的代码执行过程中,都是出现错误的时候,由浏览器(javascript引擎)抛出异常,然后程序或者停止执行,或被try…catch 捕获。
? 然而有时候我们在检测到一些不合理的情况发生的时候也可以主动抛出错误。
? 使用 throw 关键字抛出来主动抛出异常。
<script>
throw new Error("你好坏");
console.log("执行不到这里的")
</script>
注意:
throw new SyntaxError("语法错误...");
看下面的代码:
<script>
/*该函数接收一个数字,返回他的平方。*/
function foo(num) {
if(typeof num == "number"){
return num * num;
}else{
throw new TypeError("类型错误,你应该传入一个数字...")
}
}
console.log(foo(33))
console.log(foo("abc"))
</script>
? 我们不仅仅可以抛出js内置的错误类型的对象,也可以自定义错误类型,然后抛出自定义错误类型的对象。
? 如果要自定义错误类型,只需要继承任何一个自定义错误类型都可以。一般直接继承Error即可。
<script>
function MyError(message) {
this.message = "注意:这是自定义的错误"
this.name = "自定义错误";
}
MyError.prototype = new Error();
try {
throw new MyError("注意:这是自定义错误类型")
}catch (error){
console.log(error.message)
}
</script>