ASP是非常簡單的,以至於許多的開發者不會去思考錯誤處理。錯誤處理能夠讓你的應用程式更加合理。我看過很多用ASP寫的商業網站,大多數都忽略了錯誤處理。 錯誤的類型。
有三種主要的錯誤類型:
1.編譯錯誤:
這種錯誤出現一般都是程式碼的語法問題。因為編譯錯誤而導致辭ASP停止運作。
2.運行錯誤:
這個錯誤是發生在你準備運行ASP時的。例如:如果你試圖給一個變數賦值,但是卻超出了該變數允許的範圍。
3.邏輯錯誤:
邏輯錯誤是最難被發現的,這種錯誤常常是一種結構錯誤,電腦是發現不了的。這就需要我們徹頭徹尾地檢查我們的程式碼。
因為編譯錯誤一般是跟邏輯錯誤一起發生的,一般都能顯示出來,所以我們擔心的就只是運行錯誤。它都終止ASP的運行,而且給用戶丟下一堆很不友善的文字。 那我們要怎麼處理運行錯誤呢?
錯誤類型:
ADODB.Field (0x800A0BCD)
BOF 或EOF 中有一個是“真”,或目前的記錄已被刪除,所需的操作要求一個目前的記錄。
原因:你在利用SQL來尋找資料庫的記錄時,尋找結果為空,而且你沒有對空記錄的狀況做出處理。
解決:1 如果你不相信查找結果為空,那你應該考慮你的SQL語句是否正確;2 如果確實有空的情況,那你應該添加”if rs.eof then”或者”do while not rs.eof 」之類的語句,對eof的情況進行處理。
錯誤類型:
(0×80020009)
發生意外。
原因:也是在利用SQL查找資料庫記錄時,查找結果為空,而且你在後面的程式碼中呼叫了rs(“aa”)之類的記錄
解決:要嘛同上,加上rs.eof的判斷和處理,要嘛就是你的SQL語句有誤,導致記錄查不出來,也就無法在後來使用rs(“aa”)的記錄了。
錯誤類型:
Active Server Pages, ASP 0126 (0×80004005)
找不到包含檔案'xxx.asp'。
原因:就如錯誤提示所說,不存在這個包含檔。
解決:如果你確定有這個文件,那麼就是你的路徑寫錯了,比如說其實他相對於網站根目錄的路徑應該是inc/xxx.asp,那麼include裡面就應該寫inc/xxx.asp,而不僅僅是xxx.asp。附:include的寫法是:
錯誤類型:
Microsoft OLE DB Provider for ODBC Drivers (0×80004005)
[Microsoft][ODBC Microsoft Access Driver] 操作必須使用一個可更新的查詢。
原因:這個在XP伺服器上非常常見,屬於伺服器的設定問題,或者說是使用者的權限問題。
解決:如果僅僅是在本機上調試出現的錯誤,則右鍵點擊網站所在的文件夾,點擊”共享和安全…”,在”安全”中點添加…,寫入everyone,然後再使這個用戶的權限為所有,即除了第一個外全部打勾,確定之後再刷新就可以用了。 (註:如果找不到“安全性”選項,則在任何一個資料夾下點擊“工具”,然後是“資料夾選項”——“查看”,在“使用簡單文件共用”一欄把勾去掉即可)
錯誤類型:
Microsoft VBScript 編譯器錯誤(0x800A0401)
語句未結束
原因:語法錯誤。
解決:按系統所提示的行來檢查。如果提示的恰好是本頁的最後一行,則很有可能是if語句忘記寫”end if”啦,select語句忘記寫”end select”啦,總之是需要end的地方沒有end,導致伺服器找不到語句的結尾,只好在最後一行顯示錯誤。
錯誤類型:
Microsoft JET Database Engine (0x80040E10)
至少一個參數沒有被指定值。
原因:在寫SQL語句的時候,我們常常會呼叫一些參數,很可能這些參數有一個沒有被賦值。
解決:檢查每個參數的值是否真的傳遞過來了,很可能有些參數其實是”",這樣的參數去索引資料庫當然是不行的。
錯誤類型:
Microsoft JET Database Engine (0x80040E37)
Microsoft Jet 資料庫引擎找不到輸入表或查詢'AA'。 確定它是否存在,以及它的名稱的拼寫是否正確。
原因:不存在這個表。
解決:應該是你寫錯了表名,或是連錯資料庫了?再仔細核對一下吧!
錯誤類型:
Microsoft VBScript 執行階段錯誤(0x800A000D)
類型不符: /'[string: ""]/”
原因:是因為你的變數的型別是字串型的,而你卻當作數字或其他類型來使用。
解決:例如你需要數字的變數用來計算i=i+1等數學運算,那麼應該在變數上使用cint(變數名稱),強制轉換為數字型,兩個變數之間作比較也一定要是相同的型別,因此也需要轉換,方法同上。
錯誤類型:
Microsoft JET Database Engine (0x80040E07)
標準表達式中資料類型不符。
原因:一般也是在寫SQL語句時發生了錯誤,也就是把數字型和字串型的變數混淆了。
解決:很好辦,試一試把SQL中變量加了”的去掉單引號,或者把原先認為是數字的加上”,再查看效果。
錯誤類型:
Microsoft VBScript 運行是錯誤(0x800A01A8)
缺少對象:”
原因:很有可能是你沒有對rs物件進行定義。
解決:別忘了寫set rs=server.CreateObject(“adodb.recordset”),這樣可以定義物件;或者直接不用這種寫法,直接用conn.execute(“SQL”)這樣會方便得多,也不用考慮對象問題。
錯誤類型:
Microsoft VBScript 執行階段錯誤(0x800A005E)
無效使用Null: 'Replace'
原因:無效使用函數的情況也比較多見,包括Split等,這個道理也比較簡單,就是因為你Replace的內容也比較多見,包括Split等,這個道理也比較簡單,就是因為你Replace的內容是空的。
解決:最好加一句IF檢驗一下你要replace的內容是否為空。
Microsoft VBScript 編譯器錯誤錯誤'800a03f6′
ODBC 驅動程式不支援所需的屬性。
原因:可能是因為沒有sql語句裡出現的欄位名,一般都會為欄位名或sql關鍵字書寫錯誤。也有可能是sql要打開的表已經被獨佔打開。
解決方法:檢查sql語句裡出現的每個欄位名,和每個關鍵字
Microsoft OLE DB Provider for ODBC Drivers 錯誤'80004005′
機器'HDZC-3JQSKBWO02′ 上的使用者'Admin' 以獨佔方式的鎖定資料表'order_detail'。
原因:sql所需的表被access以表設計形式打開著
解決方法:關閉表設計
Microsoft VBScript 編譯器錯誤錯誤'800a03f6′
在對應所需名稱或序數的集合中,找不到項目。
原因:沒有sql語句裡出現的欄位名,一般會為欄位名或sql關鍵字書寫錯誤
解決方法:檢查sql語句裡出現的每個欄位名
ADODB.Recordset 錯誤'800a0e78′
物件關閉時,不允許操作。
原因:在rs.open sql,conn,3,3語句之前使用了rs.close關閉了rs對象
解決方法:去掉之前的rs.close
Microsoft OLE DB Provider for ODBC Drivers 錯誤'80040e14′
[Microsoft][ODBC Microsoft Access Driver] 語法錯誤(運算子遺失) 在查詢運算式'oid form classtree where oid = 25′ 中。
原因:在sql語句中存在非法書寫的英文關鍵字或子段錯誤
解決方法:把sql語句打出來,然後逐字對照,找出書寫的錯誤
操作要求一個可更新的查詢
答:看看庫文件是不是只讀了。
答2:經過排序(order by) 的記錄集(rs)不允許有更新操作(rs.update)
3219 操作在該內容中不被允許
答3:資料庫欄位屬性是否設定為允許空值插入。
adErrInvalidArgument 3001
0x800A0BB9
應用程式使用的參數其類型錯誤、超出可接受的範圍或與其他參數衝突。
adErrNoCurrentRecord 3021
0x800A0BCD
BOF 或EOF 為True,或目前記錄已刪除。應用程式請求的操作需要目前記錄。
adErrIllegalOperation 3219
0x800A0C93
應用程式請求的操作不允許出現在該上下文中
adErrInTransaction 3246
0x800A0CAE
在事務中應用程式無法明確關閉Connection 物件。
adErrFeatureNotAvailable 3251
0x800A0CB3
提供者不支援應用程式請求的操作。
adErrItemNotFound 3265
0x800A0CC1
ADO 無法在對應於應用程式要求的名稱或順序引用的集合中找到物件。
adErrObjectInCollection 3367
0x800A0D27
無法追加,物件已經在集合中。
adErrObjectNotSet 3420 0x800A0D5C 應用程式所引用的物件不再指向有效的物件。
adErrDataConversion 3421
0x800A0D5D
應用程式使用了不符合目前操作的值類型。
adErrObjectClosed 3704
0x800A0E78
如果物件關閉,則不允許應用程式要求的操作。
adErrObjectOpen 3705
0x800A0E79
如果物件打開,則不允許應用程式要求的操作。
adErrProviderNotFound 3706
0x800A0E7A
ADO 找不到指定的提供者。
adErrBoundToCommand 3707
0x800A0E7B
應用程式無法用Command 物件將Recordset 物件的ActiveConnection 屬性變更為它的來源資料。
adErrInvalidParamInfo 3708
0x800A0E7C
應用程式錯誤地定義了Parameter 物件。
adErrInvalidConnection 3709
0x800A0E7D
應用程式透過引用關閉或無效的Connection 物件來請求物件的操作。
ADODB.Field 錯誤'80020009′ BOF 或EOF 中有一個是“真”,或者當前的記錄已被刪除,所需的操作要求一個當前的記錄。
解決如下:這個錯誤是因為SELECT、DELETE的記錄不存在,或是庫中沒有記錄所引起的,所以檢查SQL語句,SELECT、DELETE的條件是否正確,還有在DELETE前最好SELECT一個記錄或用On Error Resume Next…….On Error Goto 0來處理。如果是因為庫中沒記錄,只要加個判斷If objRecordSet.Eof And objRecordSet.Bof Then就可以了,因為打開RecordSet時,指針預設是指在最面的,所以可以只用If objRecordSet.Eof Then來判斷
ActiveServerPages,ASP0126(0×80004005)–>找不到包含文件
MicrosoftOLEDBProviderforODBCDrivers(0x80040E21)–>sql語句出錯(資料型別不符或表名(字段名)錯誤或表處於編輯狀態,或表不存在於conn開啟的資料庫中)
MicrosoftOLEDBProviderforODBCDrivers(0x80040E14)–>sql語句出錯(字段名錯誤,或資料類型不符)
MicrosoftOLEDBProviderforODBCDrivers(0x80040E07)–>sql語句出錯(要插入或更新的欄位的類型與變數資料類型不符)
MicrosoftOLEDBProviderforODBCDrivers(0x80040E57)–>sql語句出錯(要插入或更新的資料溢位)
MicrosoftOLEDBProviderforODBCDrivers(0x80040E10)–>sql語句出錯(update欄位名稱或要更新的資料類型錯誤)
MicrosoftOLEDBProviderforODBCDrivers(0×80004005)–>sql語句出錯(要插入或更新的欄位的數值不能為空值)
MicrosoftOLEDBProviderforODBCDrivers(0×80004005) –>開啟資料庫出錯,沒有在指定目錄發現資料庫
MicrosoftOLEDBProviderforODBCDrivers(0x80040E37)–>沒有發現表
MicrosoftVBscript執行階段錯誤(0x800A000D)–>錯誤引用rs變數(rs物件已關閉或未定義)
MicrosoftVBscript執行階段錯誤(0x800A01C2)–>vbscript腳本錯誤(vbscript語句出錯)
MicrosoftVBscript執行階段錯誤(0x800A0006)–>vbscript腳本錯誤(溢位錯誤)
MicrosoftVBscript編譯器錯誤(0x800A040E)–>缺少loop
MicrosoftVBscript編譯器錯誤(0x800A03EA)–>缺少if或endif
MicrosoftVBscript編譯器錯誤(0x800A03EE)–> 語句未結束(缺少”)”)
MicrosoftVBscript編譯器錯誤(0x800A03F6)–>if語句出錯(缺少endif)
MicrosoftVBscript運行時錯誤(0x800A005B)–>缺少set
MicrosoftVBscript執行階段錯誤(0x800A0005)–>變數未定義
MicrosoftVBscript編譯器錯誤(0x800A03F9)–>if語句缺少then
MicrosoftVBscript編譯器錯誤(0x800A0411)–>dim語句定義錯誤
ADODB.Recordset(0x800A0BB9)–>sql語句出錯(sql語句或conn語句未定義或對一個rs屬性進行賦值時發生錯誤)
ADODB.Recordset(0x800A0CC1)–>rs物件出錯(rs物件本身不存在或錯誤地引用了一個不存在的欄位名稱)
ADODB.Recordset(0x800A0BCD)–>rs物件出錯(記錄集中沒有記錄卻對記錄集進行操作)
ADODB.Recordset(0x800A0E78)–>rs物件出錯(記錄集不存在,缺少rs.open語句)
ADODB.Recordset(0x800A0CC1) –>rs物件出錯(引用了一個不存在的欄位名稱)
ADODB.Recordset(0x800A0E7D)–>conn定義錯誤
ADODB.Recordset(0x800A0CB3)–>資料庫以唯讀方式打開,無法更新數據