2012-05-30 13 views
7

Básicamente, ¿por qué no se captura esta excepción?Excepciones lanzadas en javascript asíncrono no capturado

var http = require('http'), 
    options = { 
     host: 'www.crash-boom-bang-please.com', 
     port: 80, 
     method: 'GET' 
    }; 

try { 
    var req = http.request(options, function(res) { 
    res.setEncoding('utf8'); 
    res.on('data', function (chunk) { 
     console.log('BODY: ' + chunk); 
    }); 
    }); 

    req.on('error', function(e) { 
    throw new Error("Oh noes"); 
    }); 
    req.end(); 
} catch(_error) { 
    console.log("Caught the error"); 
} 

Algunas personas sugieren que estos errores se deben manejar con emisores de sucesos o de devolución de llamada (err) (con devoluciones de llamada con err, la firma de datos no es algo que estoy acostumbrado a)

Cuál es la mejor forma de hacerlo?

Respuesta

8

Cuando se arroja el error, el bloque try {} ha sido dejado de largo, ya que la devolución de llamada se invoca asincrónicamente fuera del try/catch. Entonces no puedes atraparlo

Haga lo que quiera en caso de error dentro de la función de devolución de llamada de error.

5

A partir de la versión de nodo 0.8 puede restringir las excepciones a domains. Puede restringir las excepciones a un dominio determinado y detectarlas en ese ámbito

Si le interesa, he escrito una pequeña función que capta las excepciones asincrónicas aquí: Javascript Asynchronous Exception Handling with node.js. Me encantaría algunos comentarios Esto le permitirá realizar las siguientes acciones:

var http = require('http'), 
    options = { 
     host: 'www.crash-boom-bang-please.com', 
     port: 80, 
     method: 'GET' 
    }; 

atry(function(){ 
    var req = http.request(options, function(res) { 
    res.setEncoding('utf8'); 
    res.on('data', function (chunk) { 
     console.log('BODY: ' + chunk); 
    }); 
    }); 

    req.on('error', function(e) { 
    throw new Error("Oh noes"); 
    }); 
    req.end(); 
}).catch(function(_error) { 
    console.log("Caught the error"); 
}); 
+0

Guau, ¡eso es realmente bueno! Estoy compartiendo esto – changelog

0

Javascript no tiene simplemente ámbito de la función, try-catch también es de ámbito de bloque. Esa es la razón.

Cuestiones relacionadas