ASP 中健壯的頁結(jié)構(gòu)的異常處理
發(fā)布時間:2008-08-22 閱讀數(shù): 次 來源:網(wǎng)樂原科技
錯誤處理是讓程序員牢騷滿腹的東西之一。讓我們來面對它,我們不寫錯誤的代碼就是了。。?;蛘哳愃频南敕ā2恍业氖?,代碼中的運(yùn)行時錯誤可能有許多的原因,從硬件、軟件的改變到使用了別的開發(fā)團(tuán)隊(duì)的代碼等等。有效的處理這些錯誤并使得它對于網(wǎng)站正常操作過程的中斷最小化是每個有良知的程序員的責(zé)任。
在本文討論的范圍內(nèi),有三個不同的地方可以發(fā)生錯誤:腳本,中間件,以及IT內(nèi)部架構(gòu)。IT內(nèi)部架構(gòu)的錯誤,比方周期性的性能降低并導(dǎo)致IIS進(jìn)行(Inetinfo.exe)崩潰幾乎是無法避免的。這種類型的錯誤通常只能打電話要求技術(shù)支持并且會讓系統(tǒng)管理員忙上很久。開發(fā)者不能為阻止這類錯誤做些什么,但是我們通常能夠應(yīng)付和改正腳本和中間件中的錯誤。 在安裝了IIS以后,缺省的服務(wù)器端腳本語言被設(shè)置成VBScript。許多Web 開發(fā)團(tuán)隊(duì)在他們的開發(fā)環(huán)境中保持了這些缺省設(shè)置,這是不幸的,因?yàn)閂BScript對于處理運(yùn)行時錯誤的支持非常的差。在VBScript中,開發(fā)者可以使用的唯一一個錯誤處理結(jié)構(gòu)是
On Error Resume Next (打開錯誤處理功能) 和
On Error GoTo 0 (關(guān)閉錯誤處理功能).
為了在你的ASP 頁面里有效的使用這個錯誤處理結(jié)構(gòu),你可能需要用這些結(jié)構(gòu)包括可能拋出異常的代碼,就象下面這樣:
<%
Dim myVar
On Error Resume Next
'下面一行代碼會在MSXML 4.0沒有被安裝或者已經(jīng)損壞的情況下產(chǎn)生錯誤
Set myVar = Server.CreateObject("MSXML2.DOMDocument.4.0")
If Err.Number <> 0 Then
' 在這里處理錯誤
' 結(jié)束錯誤處理,避免以后發(fā)生的錯誤無法被發(fā)現(xiàn)
On Error GoTo 0
Else
' myVar 現(xiàn)在指向 MSXML 4.0 DOMDocument的一個實(shí)例
' 結(jié)束錯誤處理,避免以后發(fā)生的錯誤無法被發(fā)現(xiàn)
On Error GoTo 0
End If
就象你看到的一樣,如果你要在每一行現(xiàn)有的可能發(fā)生錯誤的代碼上使用上面的規(guī)則,你的程序馬上就會充滿 "On Error" 和 "If Err.Number <> 0 Then . . ." 這樣的結(jié)構(gòu)。
而另一方面JScript對于健壯的錯誤處理機(jī)制“結(jié)構(gòu)化異常處理(SEH)”有內(nèi)建的支持。使用SEH能夠讓你的軟件開發(fā)團(tuán)隊(duì)順利的轉(zhuǎn)移到.NET 環(huán)境上來,因?yàn)镾EH是JScript.NET, VB.NET, 和 C#缺省的錯誤處理機(jī)制。(注意:.NET不支持VBScript。)下面的例子代碼執(zhí)行與VBScript代碼相同的操作,但是使用JScript語言并用SEH來處理異常
<%@ LANGUAGE="JScript" %>
<%
var myVar;
try {
myVar = Server.CreateObject("MSXML2.DOMDocument.4.0");
// 如果上面發(fā)生了錯誤,那么catch
// 代碼塊就會立刻被執(zhí)行
// 并在myVar上進(jìn)行必要的操作。
}
catch (e) {
// 在這里處理異常,異常本身可以用
// 'e' 變量進(jìn)行引用。
}
finally {
// 在這里進(jìn)行所有收尾工作
// 這段代碼不管錯誤有沒有發(fā)生
// (也就是“catch”塊有沒有運(yùn)行)
// 都會執(zhí)行。
}
%>
通過在服務(wù)器端使用JScript,你就得到了SEH帶來的好處,以及對復(fù)雜ASP對象,比方Server,Request和Response對象的完全使用。要把這種腳本語言設(shè)置成你的ASP頁面的缺省語言,你只需要簡單的在你的ASP頁面上添加@LANGUAGE指令,就象上面的例子那樣。