代码之家  ›  专栏  ›  技术社区  ›  ZeroBugBounce

如何在JavaScript中记录异常

  •  18
  • ZeroBugBounce  · 技术社区  · 7 年前

    作为一名C#开发人员,我习惯于以下类型的异常处理:

    try
    {
        throw SomeException("hahahaha!");
    }
    catch (Exception ex)
    {
        Log(ex.ToString());
    }
    
    Output
    ------
    
    SomeNamespace.SomeException: hahahaha!
        at ConsoleApplication1.Main() in ConsoleApplication1\Program.cs:line 27
    

    这真的很简单,但它告诉了我所有我需要知道的关于异常是什么以及它在哪里的信息。

    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错误中提取有用信息的方法——我已经有了一种日志机制,只想找到一种获取可记录的字符串的方法。

    6 回复  |  直到 17 年前
        1
  •  48
  •   Nacho Coloma    9 年前

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

    正如艾达指出的,你可以使用 e.message 获取异常的消息。但是,在Chrome、Firefox和IE10+中,您也可以使用 e.stack

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

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

    请注意,只有在以下情况下才能获得堆栈跟踪:

    1. 语法错误);

    因此,仅仅抛出一个字符串(抛出'Exception!!')不会给您提供堆栈跟踪。

    为了更进一步,为了捕获所有未捕获的异常,您将使用window.onerror处理程序(类似于global.asax中的.Net Application_错误处理程序)。这种方法的缺点过去是(现在仍然是)无法访问实际的异常对象,因此无法获取堆栈跟踪。你只能得到消息、url和行号。

    最近,该标准进行了扩展,为您提供了列(非常适合缩小文件)和异常对象: http://www.whatwg.org/specs/web-apps/current-work/multipage/webappapis.html#errorevent

    现在(2014年4月),只有Chrome32实现了所有这些。IE10+提供列,但不提供异常对象。Firefox28仍然只提供消息、url和行号。希望这将很快得到改善。我已经为JSNLog项目写过这方面的文章,在: http://jsnlog.com/Documentation/GetStartedLogging/ExceptionLogging

    https://github.com/mperdeck/jsnlog.js ).

    详情载于: http://jsnlog.com/Documentation/JSNLogJs/Exception

    最后是一个无耻的插件——我正在处理的JSNLog项目允许您在JavaScript中插入日志,并自动将日志消息插入现有服务器端日志中。因此,要将JavaScript异常及其堆栈跟踪记录到服务器端日志中,只需编写:

    try {
        ...
    } catch (e) {
        JL().fatalException("something went wrong!", e);
    }
    
        3
  •  14
  •   Eldar Djafarov    17 年前

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

    但若你们想得到抛出错误的行号和文件名,我想并没有交叉浏览器解决方案。消息和名称是错误对象的唯一标准属性。在mozilla中,还具有行号和文件名属性。

        4
  •  4
  •   mahju    17 年前

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

    window.onerror = function (err, file, line) {
        logError('The following error occurred: ' + 
        err + '\nIn file: ' + file + '\nOn line: ' + line);
        return true;
    }
    
        5
  •  3
  •   Rahul Makhija    6 年前

    我也有类似的问题。

    使用 console.table(error); 对我来说效果很好。

        7
  •  0
  •   Kirtan    17 年前

    您可以使用诸如 Yahoo! UI Library - Logger

        8
  •  0
  •   Chetan Jain    5 年前

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

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