try-catch语句
try-catch 语句,作为 JavaScript 中处理异常的⼀种标准⽅式。基本的语法如下所⽰:
try{
// 可能会导致错误的代码
} catch(error){
// 在错误发⽣时怎么处理
}
如果 try 块中的任何代码发⽣了错误,就会⽴即退出代码执⾏过程,然后接着执⾏ catch 块。此时,catch 块会接收到⼀个包含错误信息的对象。即使你不想使⽤这个错误对象,也要给它起个名字。这个对象中包含⼀个保存着错误消息的 message 属性和⼀个保存错误类型的name 属性。
finally ⼦句
虽然在 try-catch 语句中是可选的,但 finally ⼦句⼀经使⽤,其代码⽆论如何都会执⾏。换句话说,try
语句块中的代码全部正常执
⾏,finally ⼦句会执⾏;如果因为出错⽽执⾏了 catch 语句块,finally ⼦句照样还会执⾏。只要代码中包含 finally ⼦句,则⽆论 try 或catch 语句块中包含什么代码——甚⾄ return 语句,都不会阻⽌ finally ⼦句的执⾏。来看下⾯这个函数。
function testFinally(){
try {
return 2;
} catch (error){
return 1;
} finally {eval是做什么的
return 0;
}
}
这个函数在 try-catch 语句的每⼀部分都放了⼀条 return 语句。表⾯上看,调⽤这个函数会返回 2,因为返回 2 的 return 语句位于 try 语句块中,⽽执⾏该语句⼜不会出错。可是,由于最后还有⼀个 finally ⼦句,结果就会导致该 return 语句被忽略;也就是说,调⽤这个函数只能返回 0。如果把 finally ⼦句拿掉,这个函数将返回 2。
只要代码中包含 finally ⼦句,那么⽆论try 还是catch 语句块中的return 语句都将被忽略。
如果提供 finally ⼦句,则 catch ⼦句就成了可选的(catch 或 finally 有⼀个即可)。
错误类型
执⾏代码期间可能会发⽣的错误有多种类型。每种错误都有对应的错误类型,⽽当错误发⽣时,就会抛出相应类型的错误对象。JS有下列 7种错误类型:
Error
EvalError
RangeError
ReferenceError
SyntaxError
TypeError
URIError
其中,Error 是基类型,其他错误类型都继承⾃该类型。因此,所有错误类型共享了⼀组相同的属性(错误对象中的⽅法全是默认的对象⽅法)。Error 类型的错误很少见,如果有也是浏览器抛出的;这个基类型的主要⽬的是供开发⼈员抛出⾃定义错误。
EvalError 类型的错误会在使⽤ eval()函数⽽发⽣异常时被抛出。如果以⾮直接调⽤的⽅式使⽤ eval 属性的值,或者为 eval 属性赋值,简单地说,如果没有把 eval()当成函数调⽤,就会抛出错误,例如:
new eval(); //抛出 EvalError
eval = foo; //抛出 EvalError
在实践中,浏览器不⼀定会在应该抛出错误时就抛出 EvalError。例如,Firefox 4+和 IE8 对第⼀种情况会抛出 TypeError,⽽第⼆种情况会成功执⾏,不发⽣错误。
RangeError 类型的错误会在数值超出相应范围时触发。例如,在定义数组时,如果指定了数组不⽀持的项数(如-20 或
Number.MAX_VALUE),就会触发这种错误。
ReferenceError 类型的错误会在访问不存在的变量时发⽣。
SyntaxError 类型的错误会在我们把语法错误的 JavaScript 字符串传⼊ eval()函数时,就会导致此类错误。如果语法错误的代码出现在eval()函数之外,则不太可能使⽤ SyntaxError,因为此时的语法错误会导致 JavaScript 代码⽴即停⽌执⾏。
TypeError 类型在 JavaScript 中会经常⽤到,在变量中保存着意外的类型时,或者在访问不存在的⽅法时,都会导致这种错误。错误的原因虽然多种多样,但归根结底还是由于在执⾏特定于类型的操作时,变量的类型并不符合要求所致。下⾯来看⼏个例⼦。
var o = new 10; //抛出 TypeError
alert("name" in true); //抛出 TypeError
String.call("name"); //抛出 TypeError
最常发⽣类型错误的情况,就是传递给函数的参数事先未经检查,结果传⼊类型与预期类型不相符。
URIError 类型的错误会在使⽤ encodeURI()或 decodeURI(),⽽ URI 格式不正确时,就会导致 URIError 错误。这种错误也很少见,因为前⾯说的这两个函数的容错性⾮常⾼。
要想知道错误的类型,可以像下⾯这样在 try-catch 语句的 catch 语句中使⽤ instanceof 操作符:
try{
someFunction();
} catch (error){
if (error instanceof TypeError){
//处理类型错误
} else if (error instanceof ReferenceError){
//处理引⽤错误
} else {
//处理其他类型的错误
}
}
在跨浏览器编程中,检查错误类型是确定处理⽅式的最简便途径;包含在 message 属性中的错误消息会因浏览器⽽异。
合理使⽤ try-catch
当 try-catch 语句中发⽣错误时,浏览器会认为错误已经被处理了,因⽽不会通过本章前⾯讨论的机制记录或报告错误。对于那些不要求⽤户懂技术,也不需要⽤户理解错误的 Web 应⽤程序,这应该说是个理想的结果。不过,try-catch 能够让我们实现⾃⼰的错误处理机制。使⽤ try-catch 最适合处理那些我们⽆法控制的错误。假设你在使⽤⼀个⼤型 JavaScript 库中的函数,该函数可能会有意⽆意地抛出⼀些错误。由于我们不能修改这个库的源代码,所以⼤可将对该函数的调⽤放在 try-catch 语句当中,万⼀有什么错误发⽣,也好恰当地处理它们。
在明明⽩⽩地知道⾃⼰的代码会发⽣错误时,再使⽤ try-catch 语句就不太合适了。例如,如果传递给函数的参数是字符串⽽⾮数值,就会造成函数出错,那么就应该先检查参数的类型,然后再决定如何
去做。在这种情况下,不应⽤使⽤ try-catch 语句。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。