错误处理
使用 try—catch—finally 基本和 java 的用法是一致的
var r1, r2, s = null ;
try {
r1 = s. length;
r2 = 100 ;
} catch ( e ) {
console. log ( '出错了:' + e) ;
} finally {
console. log ( 'finally' ) ;
}
console. log ( 'r1 = ' + r1) ;
console. log ( 'r2 = ' + r2) ;
JavaScript有一个标准的Error对象表示错误,还有从Error派生的TypeError、ReferenceError等错误对象
Error 对象的两个属性:name 和 message
程序也可以主动抛出一个错误,让执行流程直接跳转到catch块,抛出错误使用throw语句
var r, n, s;
try {
s = prompt ( '请输入一个数字' ) ;
n = parseInt ( s) ;
if ( isNaN ( n) ) {
throw new Error ( '输入错误' ) ;
}
r = n * n;
console. log ( n + ' * ' + n + ' = ' + r) ;
} catch ( e ) {
console. log ( '出错了:' + e) ;
}
错误传播
js 中发生错误之后如果没有try—catch语句的话,错误会从发生的地方一层一层往上抛出,直到js引擎中断程序
我们进行错误的处理,不必到处都写try–catch语句,适当的 地方进行统一处理就可以了
function main ( s) {
console. log ( 'BEGIN main()' ) ;
try {
foo ( s) ;
} catch ( e ) {
console. log ( '出错了:' + e) ;
}
console. log ( 'END main()' ) ;
}
function foo ( s) {
console. log ( 'BEGIN foo()' ) ;
bar ( s) ;
console. log ( 'END foo()' ) ;
}
function bar ( s) {
console. log ( 'BEGIN bar()' ) ;
console. log ( 'length = ' + s. length) ;
console. log ( 'END bar()' ) ;
}
main ( null ) ;
异步错误处理
下面的代码中,错误无法被捕获,原因就在于调用setTimeout()函数时,传入的printTime函数并未立刻执行!紧接着,JavaScript引擎会继续执行console.log('done');
语句,而此时并没有错误发生;直到1秒钟后,执行printTime函数时才发生错误,但此时除了在printTime函数内部捕获错误外,外层代码并无法捕获
简单来说就是对于像setTimeout这样的异步代码,错误的捕获只能在回调函数中进行,外部是无法进行的
function printTime ( ) {
throw new Error ( ) ;
}
try {
setTimeout ( printTime, 1000 ) ;
console. log ( 'done' ) ;
} catch ( e ) {
console. log ( 'error' ) ;
}
function printTime ( ) {
try {
throw new Error ( ) ;
} catch ( e ) {
console. log ( 'error' ) ;
}
}
setTimeout ( printTime, 1000 ) ;
console. log ( 'done' ) ;