在asp調試的時候,經常是根據出現的錯誤提示來找到錯誤的地方,然後作相應的修改,直到沒有錯誤為止。這不僅是asp調試的方法,也是所有程序的調試方法。在ASP的運行過程中,如何更明白的顯示出現的錯誤在哪個頁面,第幾行,但又不能讓客戶端看到這個錯誤。所以想出來一個方法:使用on error resume next,將錯誤不顯示到頁面上,這樣就不會給客戶看到。但還要將錯誤寫到一個自定義的日志文件中,以便我們開發人員方便找到錯誤所在的頁面,或者對出現錯誤的情況下,轉向一個自定義的頁面上來,這樣能給客戶更好的體驗。
過程名:catch(str)
功 能:清除IIS的錯誤提示信息,自定義錯誤提示返回給用戶,並將出錯信息保存到txt文件(當然你也可以稍做修改轉向自定義頁面等)
使用方法:
1
<%
2
on error resume next
3
'你的代碼,如數據庫連接
4
call catch(
"顯示給用戶的提示信息"
)
5
%>
(鼠標移到代碼上去,在代碼的頂部會出現四個圖標,第一個是查看源代碼,第二個是復制代碼,第三個是打印代碼,第四個是幫助)catch 函數的具體代碼如下:
001
<%
002
option explicit
003
'例一---------------------------
004
'必須和on error resume next一起使用,但在網頁沒有正式發布之前最好將其注釋掉,以免在調試時看不到出錯詳細信息
005
on error resume next
006
'i沒有定義,會出錯,使用catch清除錯誤並保存到記事本
007
008
call catch(
"頁面無法訪問"
)
009
'-------------------------------
010
'例二---------------------------
011
function conn()
012
'必須和on error resume next一起使用
013
on error resume next
014
'...........你的連接數據庫代碼
015
call catch(
"數據庫打開錯誤"
)
016
end function
017
'-------------------------------
018
sub catch(str)
019
if err.number <> 0 then
020
dim tmp,path
021
'錯誤日志絕對路徑,如"/error_log.txt"
022
path =
"/table/error_log.txt"
023
tmp = tmp &
"出錯頁面:"
& geturl & vbcrlf
024
tmp = tmp &
"錯誤時間:"
& now() & vbcrlf
025
tmp = tmp &
"來訪IP:"
& ip & vbcrlf
026
tmp = tmp &
"提示信息:"
& str & vbcrlf
027
tmp = tmp &
"錯誤代號:"
& err.number & vbcrlf
028
tmp = tmp &
"錯誤信息:"
& err.description & vbcrlf
029
tmp = tmp &
"應用程序:"
& err.source & vbcrlf & vbcrlf & vbcrlf
030
tmp = tmp & file_read(path)
031
call file_save(tmp,path,1)
032
err.clear()
033
dIE(str)
034
end if
035
end sub
036
'以下為catch所用到的函數--------------------
037
sub echo(str)
038
response.write(str)
039
end sub
040
sub dIE(str)
041
echo(str) : response.end()
042
end sub
043
function ip()
044
ip = request.servervariables(
"remote_addr"
)
045
end function
046
'獲取當前URL
047
function geturl()
048
dim tmp
049
if lcase(request.servervariables(
"https"
)) =
"off"
then
050
tmp =
"http://"
051
else
052
tmp =
"https://"
053
end if
054
tmp = tmp & request.servervariables(
"server_name"
)
055
if request.servervariables(
"server_port"
) <> 80 then
056
tmp = tmp &
":"
& request.servervariables(
"server_port"
)
057
end if
058
tmp = tmp & request.servervariables(
"url"
)
059
if trim(request.querystring) <>
""
then
060
tmp = tmp &
"?"
& trim(request.queryString)
061
end if
062
geturl = tmp
063
end function
064
'函數:讀取文件內容到字符串
065
function file_read(path)
066
dim tmp : tmp =
"false"
067
if not file_exists(path) then file_read = tmp : exit function
068
dim stream : set stream = server.CreateObject(
"ADODB.Stream"
)
069
with stream
070
.type = 2
'文本類型
071
.mode = 3
'讀寫模式
072
.charset =
"gb2312"
073
.open
074
.loadfromfile(server.MapPath(path))
075
tmp = .readtext()
076
end with
077
stream.close : set stream = nothing
078
file_read = tmp
079
end function
080
'函數:保存字符串到文件
081
function file_save(str,path,model)
082
if model<>0 and model<>1 then model=1
083
if model=0 and file_exists(path) then file_save=true : exit function
084
dim stream : set stream = server.CreateObject(
"ADODB.Stream"
)
085
with stream
086
.type = 2
'文本類型
087
.charset =
"gb2312"
088
.open
089
.writetext str
090
.savetofile(server.MapPath(path)),model+1
091
end with
092
stream.close : set stream = nothing
093
file_save = file_exists(path)
094
end function
095
'函數:檢測文件/文件夾是否存在
096
function file_exists(path)
097
dim tmp : tmp = false
098
dim fso : set fso = server.CreateObject(
"Scripting.FilesyStemObject"
)
099
if fso.fileexists(server.MapPath(path)) then tmp = true
100
if fso.folderexists(server.MapPath(path)) then tmp = true
101
set fso = nothing
102
file_exists = tmp
103
end function
104
%>