2009-01-17 129 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