2009-08-06 10 views
13

Como desarrollador de C# que estoy acostumbrado a la siguiente estilo de manejo de excepciones:Cómo iniciar sesión excepciones en JavaScript

try 
{ 
    throw SomeException("hahahaha!"); 
} 
catch (Exception ex) 
{ 
    Log(ex.ToString()); 
} 

Output 
------ 

SomeNamespace.SomeException: hahahaha! 
    at ConsoleApplication1.Main() in ConsoleApplication1\Program.cs:line 27 

Es realmente simple, y sin embargo me dice todo lo que necesito saber acerca de lo que fue la excepción y donde estaba.

Cómo logro lo equivalente en JavaScript donde el objeto de la excepción en sí mismo podría ser una cadena. Realmente quiero ser capaz de conocer la línea exacta de código en la que ocurrió la excepción, sin embargo, el siguiente código no registra nada útil en absoluto:

try 
{ 
    var WshShell = new ActiveXObject("WScript.Shell"); 
    return WshShell.RegRead("HKEY_LOCAL_MACHINE\\Some\\Invalid\\Location"); 
} 
catch (ex) 
{ 
    Log("Caught exception: " + ex); 
} 

Output 
------ 

Caught exception: [object Error] 

EDITAR (de nuevo): Solo para aclarar, este es para aplicaciones internas que hace un uso intensivo de JavaScript. Busco una forma de extraer información útil de los errores de JavaScript que pueden quedar atrapados en el sistema de producción: ya tengo un mecanismo de registro, solo quiero una manera de obtener una cadena sensible para iniciar sesión.

Respuesta

3

Puede usar casi de la misma manera, es decir.

try 
{ 
    throw new Error("hahahaha!"); 
} 
catch (e) 
{ 
    alert(e.message) 
} 

Pero si desea obtener el número de línea y el nombre del archivo donde se lanza el error supongo que no hay una solución crossbrowser. El mensaje y el nombre son las únicas propiedades estándar del objeto Error. En mozilla también tiene propiedades lineNumber y fileName.

+0

Esto no funciona en el servidor. Además, no es UX moderno. –

2

No estoy seguro de si es o no es el navegador cruz o si es lo que buscas, pero te recomiendo que pruebes:

window.onerror = function (err, file, line) { 
    logError('The following error occurred: ' + 
    err + '\nIn file: ' + file + '\nOn line: ' + line); 
    return true; 
} 
15

Yo sé que soy 4 años tarde a la fiesta aquí , pero todavía sentía el impulso de agregar mis 2 centavos.

Como señala Eldar, puede usar e.message para obtener el mensaje de la excepción. Sin embargo, en Chrome, Firefox e IE10 +, también puedes obtener el seguimiento de la pila usando e.stack. El seguimiento de pila incluirá el archivo y el número de línea de la excepción.

Así que para montar una cadena con información excepción, podría escribir algo como esto:

var exmsg = ""; 
if (e.message) { 
    exmsg += e.message; 
} 
if (e.stack) { 
    exmsg += ' | stack: ' + e.stack; 
} 

Tenga en cuenta que sólo obtendrá un seguimiento de pila si

  1. la excepción fue lanzada por el navegador (como en respuesta a un error de sintaxis );
  2. el objeto de excepción es un objeto Error o tiene el objeto Error como su prototipo.

Así que tan solo tirar una cuerda (arrojar 'Excepción !!') no le dará un rastro de pila.

Para llevar esto un poco más lejos, para detectar todas las excepciones no detectadas, usaría un controlador window.onerror (similar al controlador .NET Application_Error en global.asax).El inconveniente de esto solía ser (y aún lo es) que esto no le daría acceso al objeto de excepción real, por lo que no podría obtener el seguimiento de la pila. Solo obtendrías el mensaje, la url y el número de línea.

Recientemente, la norma ha sido extendida para darle la columna (ideal para archivos minified) y el objeto de excepción, así: http://www.whatwg.org/specs/web-apps/current-work/multipage/webappapis.html#errorevent

En este momento (abril de 2014), sólo Chrome 32 implementos, todo esto. IE10 + le proporciona la columna pero no el objeto de excepción. Firefox 28 solo le proporciona mensajes, url y número de línea. Con suerte, esto mejorará pronto. He escrito sobre esto para el proyecto JSNLog, en: http://jsnlog.com/Documentation/GetStartedLogging/ExceptionLogging

(exención de responsabilidad: yo soy el autor de JSNLog y jsnlog.com)

En segundo lugar, el objeto de excepción .NET admite excepciones internas. También tiene una propiedad de Datos para que pueda adjuntar pares de valores clave con, por ejemplo, valores de variables. Lo perdí en el objeto JavaScript Error, así que creé mi propio objeto Exception, también como parte del proyecto JSNLog. Está en el archivo jsnlog.js en el proyecto jithnlog.js Github (https://github.com/mperdeck/jsnlog.js).

Descripción está en: http://jsnlog.com/Documentation/JSNLogJs/Exception

Por último, un enchufe descarado - el proyecto JSNLog Estoy trabajando en le permite insertar madereros en su JavaScript, e inserta automáticamente los mensajes de registro en el registro del lado del servidor existente. Así que para conectarse con sus excepciones JavaScript trazas de la pila a su registro del lado del servidor, sólo es necesario escribir:

try { 
    ... 
} catch (e) { 
    JL().fatalException("something went wrong!", e); 
} 
+0

Sé que tengo 3 años de retraso en la fiesta ... pero estoy bastante seguro de que si lanza una excepción real (no solo una cadena), obtendrá ese rastro de pila. De esta manera: 'lanzar nueva Excepción ('Excepción !!');'. – samson

22

No se especifica si se está trabajando en el navegador o el servidor. Si es la primera, existe un nuevo método y console.errore.stack propiedad:

try { 
    // do some crazy stuff 
} catch (e) { 
    console.error(e, e.stack); 
} 

Por favor, tenga en cuenta que el error funcionará en Firefox y Chrome, pero no es estándar. Un ejemplo rápido que rebajar a console.log log e si no hay e.stack:

try { 
    // do some crazy stuff 
} catch (e) { 
    (console.error || console.log).call(console, e.stack || e); 
} 
+0

muy útil, gracias –

Cuestiones relacionadas