【问题标题】:JavaScript exception handling - displaying the line numberJavaScript 异常处理 - 显示行号
【发布时间】:2010-12-26 10:32:49
【问题描述】:

在 JavaScript 中捕获/处理异常时,如何确定异常发生时的调用堆栈是什么? (如果可能的话,行号是什么)

try
{
    // etc...
}
catch (ex)
{
    // At this point here I want to be able to print out a detailed exception 
    // message, complete with call stack, and if possible line numbers.
}

【问题讨论】:

    标签: javascript exception-handling callstack


    【解决方案1】:

    对于大多数个错误,您可以检查堆栈跟踪,其中将包括错误位置的行号和列号:

    try {
      throw new Error('foo');
    } catch(e) {
      console.log(e.message);
      console.log(e.stack);
      const [, lineno, colno] = e.stack.match(/(\d+):(\d+)/);
      console.log('Line:', lineno);
      console.log('Column:', colno);
    }

    第 13 行是正确的,因为那是 HTML 中来自 stacksn-ps.net 的响应中的错误所在的行:

    请注意,这适用于抛出的非错误,例如 throw nullthrow 'foo'(不推荐正是出于这个原因)。

    【讨论】:

      【解决方案2】:

      我发现在 IE 下运行的 JavaScript 中,无法在捕获异常时捕获堆栈跟踪。根据thisPDF,在 IE 中获取堆栈跟踪的唯一方法是不处理异常。

      【讨论】:

        【解决方案3】:

        看看this

        一种分析可用信息的方法:

        try 
        { 
            doInit(); 
        } catch(err) 
        { 
            var vDebug = ""; 
            for (var prop in err) 
            {  
               vDebug += "property: "+ prop+ " value: ["+ err[prop]+ "]\n"; 
            } 
            vDebug += "toString(): " + " value: [" + err.toString() + "]"; 
            status.rawValue = vDebug; 
        }
        

        【讨论】:

        • 请注意 - 如果您使用的是节点服务器端,这非常有效。已投票 - 感谢您的发帖!
        【解决方案4】:

        每个浏览器对此的处理方式不同,因此没有通用的方法。 This blog post 有一些很好的代码可以为大多数受支持的浏览器转储堆栈跟踪。我认为没有提供行号的好方法。

        如果您特别想调试一个函数,Firebug 有一个很好的堆栈跟踪函数(vis console.trace())。

        【讨论】:

        • 那个博客已经很老了(2008 年)。一定有更好的方法。
        猜你喜欢
        • 2010-10-15
        • 1970-01-01
        • 1970-01-01
        • 2013-01-09
        • 2021-06-21
        • 1970-01-01
        • 2010-09-17
        • 1970-01-01
        相关资源
        最近更新 更多