2009-01-17 171 views

回答

10

有一种方法,虽然比较昂贵:抛出一个异常,立即捕获它,并从堆栈跟踪中挖出第一个条目。有关如何解析跟踪的示例here。普通Java也可以使用相同的技巧(如果代码是在打开调试信息的情况下编译的话)。

编辑:显然不是所有的浏览器都支持这个。好消息是(感谢评论Christoph!),一些浏览器输出源文件名和行号directly through the fileName and lineNumber properties of the error object

+2

浏览器添加了一个堆栈跟踪错误对象可能也直接暴露了`lineNumber`财产 - 不需要解析那里... – Christoph 2009-01-18 10:49:54

6

简短的回答是没有

长的答案是,根据您的浏览器,您可能会抛出异常并拖出一个堆栈跟踪&。

我怀疑你是用来调试的(我希望如此,无论如何!)所以你最好的选择是使用Firebug。这会给你一个console的对象;你可以在任何时候调用console.trace()来查看你的程序正在做什么而不会中断执行。

0

有一种解决方法。

通常将__ LINE __与__ FILE __结合用于在代码中标记位置,并且稍后将标记完成以找到该位置。

但是,通过使用全局唯一标识符(GUID-s)而不是__ LINE __和__ FILE __可以实现相同的效果。该解决方案的详细信息位于BSD许可工具集的COMMENTS.txt中,可自动执行此过程。

+1

我不明白......你能解释一下吗? – Jason 2012-06-21 03:34:18

3

A中的__LINE__扩展了preprocessor,它将字面上用当前输入的行号替换。所以,当你看到

printf("Line Number: %d\r\n", __LINE__); 

编译器看到:

printf("Line Number: %d\r\n", 324); 

实际上数(324在这种情况下)是硬编码到程序中。这只是这个双通机制,使这成为可能。

我不知道PHP如何实现这一点(它是否预处理?)。

+3

是的,PHP是预处理的。事实上,这是一个递归的缩写:PHP - > PHP:超文本预处理器。尽管首字母缩写最初是用于*个人主页*。 – alex 2010-02-19 05:53:30

2

您可以尝试在JavaScript文件上运行C预处理程序(f.e. cpp,来自GNU Compiler Collection) - 通过每次请求动态地或静态地运行,每次更改JavaScript文件时都会应用此操作。我认为javascript语法足够类似于这个工作。

然后你会拥有C预处理器的所有能力。

0

我认为预处理更有意义,因为它不会增加运行时开销。 C预处理器的一个替代方法是使用perl,如下面的2个步骤所示:

1 - 将“999#行”添加到脚本中需要编号的每一行,例如,,

alert ("Line # 999 \n"+request.responseText); 

2 – run the perl below: 

cat my_js.js | perl -ane "{ s/Line # \d+ /Line # $. /; print $_;}" > C_my_js.js; mv C_my_js.js my_js.js