7.1.1 文法或“編譯”錯誤
當我們第一次運行新編寫的程式碼時,通常看到的第一種錯誤類型是“syntax error”。這就是所說的,程式碼上的語法錯誤。這就像在寫作中使用了錯誤的文法,使讀者不能瞭解其中的含義。而解譯器(諸如指令碼引擎)和編譯器對文法要求得更加嚴格和準確。
語法錯誤通常也是最早出現和需要排除的。大多數情況下,解譯器和編譯器會指出行號和所在行中的字元位置,以及在相應的位置上缺少的內容。下面舉一個簡單的例子,如下所示的這樣一段程式:
<%
Response.Write "The repayments for your loan are $" & chrPayment _
& " per " & strInterval & , due on the " &strDay & " of each "
& strInterval & "."
%>
我們希望得到下面的結果:
The repayments for your loan are $124.50 per month, due on the 12th of each month.
實際上得到的結果如圖7-1所示:
If objASPError.ASPDescription > "" Then Response.Write Server.HTMLEncode(objASPError.ASPDescription) & "<br>"
blnErrorWritten = False
Response.Write "<B>"
If objASPError.Description > "" Then Response.Write Server.HTMLEncode(objASPError.Description) & "<br>"
' Only show the Source if it is available and the request is from the same machine as IIS
…
檔案中第3行是Response.Write語句的第2行。報告錯誤資訊時,VBScript解譯器忽略一行中的引導空格和定位字元。所以在數完26個字元之後,可以找到語法錯誤的地方,這裡明顯缺少了一個雙引號。加上雙引號後再運行這個頁面,我們可以得到如圖7-2所示:
圖7-2 程式執行結果2
這次又是另外一個簡單錯誤。實際上錯誤出現在第3行而不是第4行。我們漏掉了第三行末尾的續行符'_'。程式碼應該是:
<%
Response.Write "The repayments for your loan are $" & chrPayment _
& " per " & strInterval & ", due on the " &strDay & " of each " _
& strInterval & "."
%>
1. 錯誤出現在什麼地方
需要注意的是指令碼解譯器僅指出所發現錯誤的地方,但實際上那兒並不一定是錯誤真正出現的地方。在上例中,前面三行的文法正確的;併產生相應的輸出結果,而恰恰是第4行引起問題,因為這一行是以一種非法字元開頭的,指令碼解譯器沒有意識到這一行是上一行的一部分。
這樣的錯誤是普遍存在的,因為通常我們主要考慮的是要輸出的常值內容,而不是雙引號、連字號(在VBScript中為“&”)、續行符等的正確順序。
對於關鍵字、內建函式名拼字錯誤或函數的非法參數列表而引起的語法錯誤,通常比較容易發現,因為錯誤資訊提示可能就指出了錯誤的實際位置。例如:下面這段代碼是想把明天的日期寫入頁面。
Response.Write DateAdd(Now(),"d", 1)
實際得到的結果如圖7-3所示: