大家知道,即使程式設計師抱有最好的願望,而且計畫工作做得非常周密,也無法避免**出現錯 誤。實際上可能出現的程式錯誤是很多的,但是它們基本上可以分為兩種型別:一種是編譯錯誤;另一種 是執行期錯誤。編譯錯誤是指使得 visual bacsic(下面簡稱 vb)的編譯器無法對**進行編譯的錯誤。 如果乙個過程中包含了編譯錯誤,vb 將不執行該過程,並且我們也不能向使用者提供帶有編譯錯誤的執行期 版本應用程式,大多數編譯錯誤是句法錯誤造成的。
一、vb 的編譯選項
vb 有兩個設定項會在很大程度上影響我們建立非常堅實的**的能力。乙個設定項是 compile on demand(按需要進行編譯),另乙個設定項是 background compile(後台編譯)。可以開啟 options 對話方塊,選定 general 選項卡,然後對這兩個設定項進行設定。
當選定 compile on demand 時,如果單擊工具欄上的 run 按鈕,或者按 f5 鍵,vb 並不全面編譯我們的專案。相反,只在引用過程時, 才對這些過程進行編譯。使用 compile on demand,通常可使比較大的專案或者速度較慢的計算機上的項 目能夠更快地啟動執行,但是它也會產生某些不被注意的編譯錯誤。 在發現和糾正所有編譯錯誤之前,不能將專案編譯成.exe 或.dll 之類的可發布檔案,因此,選定 compile on demand 並不能夠發布帶有編譯錯誤的**。但是,選定 compile on demand 後,會導致編 譯錯誤隨著時間的推移而不斷增加,從而在最後試圖進行全面編譯時,迫使我們對**進行大量的糾錯。 如果在 ide 中除錯專案,vb 常常必須停止(不只是暫停)執行,以便進行糾錯操作。這使得除錯正在運 行的專案時對大量編譯錯誤的糾正操作變得非常麻煩。如果能夠在合理的時間內全面編譯專案,那麼可以 考慮關閉 compile on demand。也可以使 compile on demand 保持選定狀態,但是要定期按 ctrl+f5 鍵, 以便重新執行我們的專案。這使我們在程式設計時能夠定期糾正編譯錯誤,而不必一次性糾正大量的編譯錯誤。 圖 1編譯時選中 compile on demand 和 background compile 兩個選項。
二、err 物件
在能夠編寫有效的錯誤處理**之前,我們必須了解 vb 的 err 物件,這是個執行期物件,它包 含了關於最新錯誤的資訊。當程式執行時遇到乙個錯誤,或者當我們使用 err 物件的 raise 方法故意引發 乙個錯誤時,便形成 err 物件的屬性。當遇到 on error 語句(比如 on error resume next),並且在使用 exit sub、exit function 或 exit property 語句退出乙個過程後,error 物件的屬性值就被清除。若要顯式清 除 err 物件,可以呼叫它的 clear 方法。下表 1 列出了 err 物件的屬性。 屬性 說明 number 用於標識該錯誤的專用號碼 source 當前 vb 專案的名字 description 表義性的錯誤消 息。如果某個錯誤沒有這個字串,本屬性就會指明"應用程式定義的錯誤或物件定義的錯誤" helpfile 與 錯誤相關的 vb 幫助檔案所在的驅動器、路徑和檔名 helpcontext vb 幫助檔案用於該錯誤的上下文 id lastdllerror 在 32 位 microsoft windows 作業系統上,上次呼叫動態鏈結庫(dll)的系統錯誤**。lastdllerror 屬性是唯讀屬性
三、錯誤處理程式的型別
將乙個專案當作已經編譯的程式執行時,未捕獲的錯誤會造成致命的後果,它們會導致程式終 止執行。必須盡一切努力防止發生這種情況。若要防止**中的錯誤中斷**的執行(並終止已編譯程式 的執行),我們可以建立錯誤處理程式以捕獲**中的錯誤。當捕獲乙個錯誤後,vb 並不顯示出錯訊息, 也不終止**的執行。相反,我們編寫的專門用來處理錯誤的**則開始執行。每個過程都應該擁有錯誤 處理程式,而不管它包含多大的**量。最好在**中放入乙個 on error 語句,作為**的第一行,放在 緊靠過程標題的後面和變數說明的前面。如果乙個過程的錯誤能夠以這種方式出現,就應該在過程的開頭 用突出的注釋來明確說明這一行為特性。 若要捕獲錯誤,基本上可以使用下面兩種方法: 當出現錯誤時,使用 on error goto,轉移到別的**上去執行。 使用 on error resume next 語句,不中斷**的執行,也不轉移到別的**上去執行,而是 忽略該錯誤。 可以在乙個過程中建立多個錯誤處理程式 但每次只能啟用乙個錯誤處理程式 vb 將最新的 on error , 。 語句中指明的處理程式視為已經啟用的錯誤處理程式。切換乙個過程中的不同位置上的錯誤處理程式,往 往是很有好處的,理解各個錯誤處理程式如何執行,是利用這一功能的關鍵。
1、使用 on error resume next 以忽略錯誤 對錯誤進行處理的最簡單(和最危險)的方法是使用 on error resume next 語句。on error resume next 語句規定,**中的錯誤將完全被忽略,存在錯誤的**行被跳過,然後繼續執行下乙個語 句。例如,下面這個過程存在乙個執行期錯誤(即乙個被 0 除的錯誤),它由 on error resume next 錯 誤處理程式來處理: private sub cmdgenerateerror_click() '* purpose: test on error resume next on error resume next debug.print 10 / 0 end sub debug.print 語句產生了乙個被 0 除的錯誤。但是,由於存在乙個已經啟用的錯誤處理程式(由 on error resume next 指定),因此該錯誤被忽略,並在下乙個語句(即 end sub 語句)上恢復執行。 錯誤被忽略並不意味著我們無法知道錯誤已經發生。當乙個語句產生了乙個錯誤之後,儘管沒有顯示出錯 訊息,err 物件仍然包含關於該錯誤的資訊。
2、使用 on error goto 轉移執行的**流 除非我們捕獲了乙個意料之外的錯誤,比如上面**中的那種錯誤,否則忽略**中的錯誤是 非常危險的,並且是一種不得已時採用的辦法。當乙個過程中出現了意料之外的錯誤時,該過程就會產生 許多問題。如果忽略該錯誤,就會對使用者產生嚴重的影響,比如資料沒有儲存,或者儲存不正確。許多情 況下,當出現**錯誤時,必須執行某些操作,將**的執行轉移到 on error goto 語句中指定的錯誤處 理程式。該語句的句法如下: on error goto line 請注意,line 必須是指與 on error goto 語句相同的過程中的乙個語句。 在這個句法中, line 有兩個意思。首先它是指出現錯誤時要轉移到的這個**行號。不過這個 行號並不是過程中的**行的物理位置。請看下面這個**例子: private sub testerrorhandler() '* purpose : test the on error goto statement by deliberately '* generating a run-timeerror. on error goto 4 debug.print "line 2" debug.print 10 / 0 debug.print "line 4" debug.print "line 5" end sub 我們可能認為,被 0 除的錯誤會導致**在輸出文字 line 4 這個語句上繼續執行,因為這是** 的第四個語句(不是計數注釋)。不僅這種情況不會發生,而且該**實際上會導致產生乙個編譯錯誤, 並且**根本不會執行。
break in class module(在類模組中中止)。
break on unhandled errors(在未處理的錯誤上中止)。
break on all errors 實際上可使所有錯誤處理程式均取消啟用狀態。當出現乙個錯誤時,無論是 否啟用了處理程式,**均在出錯的語句上進入中止方式,同時 vb 顯示一條出錯訊息。這使我們能夠在 ide 進行測試時處理意料不到的錯誤。
MySql錯誤處理 錯誤處理的例子
有幾種錯誤處理的宣告形式 如果任何錯誤 不是 not found 設定 l error 為 1 後繼續執行 declare continue handler for sqlexception set l error 1 如果發生任何錯誤 不是 not found 執行 rollback和產生一條錯誤...
MySql錯誤處理(三) 錯誤處理的例子
mysql錯誤處理 三 錯誤處理的例子 有幾種錯誤處理的宣告形式 如果任何錯誤 不是 not found 設定 l error 為 1 後繼續執行 declare continue handler for sqlexception set l error 1 如果發生任何錯誤 不是 not foun...
PHP 錯誤處理
在 php 中,預設的錯誤處理很簡單。一條訊息會被傳送到瀏覽器,這條訊息帶有檔名 行號以及一條描述錯誤的訊息。在建立指令碼和 web 應用程式時,錯誤處理是乙個重要的部分。如果您的 缺少錯誤檢測編碼,那麼程式看上去很不專業,也為安全風險敞開了大門。本教程介紹了 php 中一些最為重要的錯誤檢測方法。...