2009-08-06 66 views
13

正如我已经习惯了的异常处理下面的样式C#开发人员:如何记录异常在JavaScript

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

Output 
------ 

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

它很简单,却又告诉我的一切,我需要知道的例外是什么和它在哪里。

如何在JavaScript中实现等同的事情,其中​​异常对象本身可能只是一个字符串。我真的希望能够知道的代码在异常事件发生的确切行,但是下面的代码不记录在所有有用的东西:

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] 

编辑(再次):我想弄清楚,这适用于大量使用JavaScript的内部应用程序。我在从生产系统中可能捕获的JavaScript错误中提取有用信息的方式之后 - 我已经有一个日志记录机制,只是想获得一个明智的字符串来记录。

回答

3

你可以使用几乎相同的方式,即。

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

但是,如果你想要得到行号和文件名错误被抛出,我想没有crossbrowser解决方案。消息和名称是Error对象的唯一标准属性。在mozilla中,你也有lineNumber和fileName属性。

+0

这不适用于服务器端。另外,它不是现代用户体验。 – 2016-01-21 14:59:19

2

我不知道它是否是跨浏览器,或者如果它是你在找什么,但是我建议你试试:

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

我知道我4年迟到了这里,但仍然觉得有兴趣增加我的2美分。

正如Eldar指出的那样,您可以使用e.message来获取异常消息。但是,在Chrome,Firefox和IE10 +中,您还可以使用e.stack获取堆栈跟踪。堆栈跟踪将包含异常的文件和行号。

因此装配了带有异常信息的字符串,你会写是这样的:

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

注意,如果

  1. 异常被浏览器引发的,你只会得到一个堆栈跟踪(如响应 语法错误);
  2. 该异常对象是一个Error对象或具有Error对象作为其原型。

所以只是抛出一个字符串(抛出'异常!!')不会给你一个堆栈跟踪。要进一步捕获所有未捕获的异常,可以使用window.onerror处理程序(类似于global.asax中的.Net Application_Error处理程序)。这个过去的缺点是(并且大部分仍然是),这不会让你访问实际的异常对象,所以你不能得到堆栈跟踪。你只会得到消息,网址和行号。

近日,该标准已经扩展到给你列(伟大的缩小的文件)和异常对象还有: http://www.whatwg.org/specs/web-apps/current-work/multipage/webappapis.html#errorevent

现在(2014年4月),只有Chrome 32版本工具这一切。 IE10 +为您提供列但不包含异常对象。 Firefox 28仍然只提供消息,网址和行号。希望这会很快改善。我写这个的JSNLog项目,在: http://jsnlog.com/Documentation/GetStartedLogging/ExceptionLogging

(免责声明:我JSNLog的作者和jsnlog.com)

其次,净异常对象支持内部异常。它还具有Data属性,因此您可以将键值对与例如变量值相关联。我有点错过了JavaScript Error对象,所以我创建了自己的Exception对象,也作为JSNLog项目的一部分。它位于jsnlog.js Github项目(https://github.com/mperdeck/jsnlog.js)中的jsnlog.js文件中。

说明在: http://jsnlog.com/Documentation/JSNLogJs/Exception

最后一个无耻的插件 - 该项目JSNLog我的工作可以让你在JavaScript中插入记录器,并自动在你现有的服务器端日志插入日志消息。所以登录JavaScript异常与他们的堆栈跟踪到你的服务器端日志,你只需要编写:

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

我知道_我3年晚了......但我敢肯定,如果你抛出一个实际的异常(不只是一个字符串),你会得到这个堆栈跟踪。像这样:'抛出新的异常('异常!!');'。 – samson 2017-06-13 21:44:40

22

如果你是在浏览器或服务器工作不指定。如果是前者,有一个新的console.error方法和e.stack属性:

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

请记住,错误会在Firefox和Chrome浏览器,但它不是标准。一个简单的例子,将降级为console.log和日志e如果没有e.stack

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

非常有用,谢谢 – 2017-08-31 12:54:34