【问题标题】:How to log exceptions in JavaScript如何在 JavaScript 中记录异常
【发布时间】:2010-11-17 07:16:48
【问题描述】:

作为一名 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]

EDIT(再次):澄清一下,这是针对大量使用 JavaScript 的内部应用程序。我正在寻找一种从生产系统中可能捕获的 JavaScript 错误中提取有用信息的方法——我已经有了一个日志记录机制,只是想要一种获取合理字符串进行日志记录的方法。

【问题讨论】:

    标签: javascript exception-handling


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      我也遇到过类似的问题。

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

      【讨论】:

        【解决方案3】:

        正如 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. 异常对象是一个错误对象或以错误对象作为其原型。

        所以仅仅抛出一个字符串(抛出 '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 仍然只给你消息、url 和行号。希望这会很快得到改善。我已经为 JSNLog 项目写过这个,在: http://jsnlog.com/Documentation/GetStartedLogging/ExceptionLogging

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

        其次,.Net Exception 对象支持内部异常。它还具有 Data 属性,因此您可以将键值对附加到变量值中。我在 JavaScript 错误对象中有点错过了这一点,所以我创建了自己的异常对象,也是 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);
        }
        

        【讨论】:

        • 我知道 迟到了 3 年......但我很确定如果你抛出一个实际的异常(不仅仅是一个字符串),你会得到那个堆栈跟踪。像这样:throw new Exception('Exception!!');.
        【解决方案4】:

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

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

        请记住,该错误适用于 Firefox 和 Chrome,但它不是标准的。如果没有e.stack,将降级到console.log 并记录e 的快速示例:

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

        【讨论】:

        • 唯一没有 e.stack 的浏览器是 IE 9 和更早版本 - 根据 Net Marketshare,它们占浏览器市场份额不到 2%。我当然不会担心支持那些浏览器——微软多年前就终止了对 IE 8 的扩展支持,所以我不知道谁还在使用它。
        【解决方案5】:

        我不确定它是跨浏览器还是你要找的东西,但我建议你试试:

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

        【讨论】:

          【解决方案6】:

          您几乎可以以相同的方式使用 ie。

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

          但是,如果您想获取抛出错误的行号和文件名,我想没有跨浏览器解决方案。 Message 和 name 是 Error 对象的唯一标准属性。在 mozilla 中,您还具有 lineNumber 和 fileName 属性。

          【讨论】:

          • 这在服务器端不起作用。此外,它不是现代用户体验。
          【解决方案7】:

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

          【讨论】:

            【解决方案8】:

            【讨论】:

            • 我真的很想知道如何从异常中提取有用信息 - 我已经改写了我的问题。
            猜你喜欢
            • 2011-08-22
            • 1970-01-01
            • 2023-04-02
            • 2021-06-21
            • 2014-02-28
            • 1970-01-01
            • 2015-04-13
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多