如何在JavaScript中记录异常

时间:2009-08-06 10:02:09

标签: javascript exception-handling

作为C#开发人员,我习惯了以下异常处理方式:

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错误中提取有用信息的方法 - 我已经有了一种记录机制,只是希望获得一个合理的字符串来记录。

8 个答案:

答案 0 :(得分:29)

您不指定您是在浏览器还是服务器中工作。如果是前者,则会有一个新的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);
}

答案 1 :(得分:21)

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

因此,要组装带有异常信息的字符串,您可以编写如下内容:

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

请注意,只有

才能获得堆栈跟踪
  1. 浏览器抛出异常(例如响应a 语法错误);
  2. 异常对象是一个Error对象,或者将Error对象作为其原型。
  3. 所以只抛出一个字符串(抛出'Exception !!')就不会给你一个堆栈跟踪。

    为了更进一步,要捕获所有未捕获的异常,您将使用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的作者)

    其次,.Net Exception对象支持内部异常。它还具有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);
    }
    

答案 2 :(得分:6)

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

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

但是如果你想获得引发错误的行号和文件名,我想没有crossbrowser解决方案。消息和名称是Error对象的唯一标准属性。在mozilla中,您还有lineNumber和fileName属性。

答案 3 :(得分:2)

我不确定它是否是跨浏览器或者它是否正在寻找,但我建议您尝试:

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

答案 4 :(得分:0)

答案 5 :(得分:0)

您可以使用Yahoo! UI Library - Logger等日志记录工具记录错误/信息性消息。

答案 6 :(得分:0)

我有类似的问题。

使用console.table(error);对我来说效果很好。 它在表格中显示信息,还允许我展开/折叠以查看更多详细信息。

答案 7 :(得分:0)

我为它写了一个方便的函数


const logError = (e: any) => {
   if (console.error) console.error(e, e.stack);
   else console.log(e)
}