簡介
在程式設計中,錯誤,是指不希望的程式運行狀態。 它不是程式在編譯過程中的錯誤,而是程式在運行中可能出現的錯誤,是程式運行中的不穩定狀態。這種不穩定狀態是由異常條件產生,所以在有些程式語言中就叫異常。錯誤處理程式是指軟體系統中用於處理錯誤的程式,在程式設計或軟體系統設計中,錯誤處理程式是不可或缺的一部分,因為錯誤處理程式可以幫助軟體設計人員很快找到錯誤原因及解決方案。
錯誤處理程式的步驟
常見的錯誤類型有:語法錯誤、運行錯誤、邏輯上錯誤。錯誤處理程式的設定一般分為三個步驟:
錯誤捕獲的設定。On Error語句,該語句可以啟動一個錯誤處理程式而且指定該子程式在一個過程中的位置;也可用來禁止一個錯誤處理程式。當Visual Basic執行到語句 On Error時激活錯誤捕獲,用On Error指定錯誤處理程式。
錯誤處理例程的編寫。編寫錯誤處理例程首先要添加行標籤,把這個標籤標誌著錯誤處理例程的開始。行標籤是一個具有描述性的名稱,它的後邊必須加冒號。有一個公共的約定就是把錯誤處理代碼書寫在過程的尾部。在緊靠行標籤的前方要書寫Exit Sub,Exit函式或Exit屬性語句。若沒有出現錯誤,就可以避免錯誤處理代碼的執行。
退出錯誤處理例程的編寫。指定錯誤處理程式後決定程式要到哪裡去執行,FileExists()函式示例使用錯誤處理程式內的Resume語句,重新執行之前導致錯誤的那條語句,相當於Ignore。
語法錯誤
語法錯誤是指程式的語法有誤,編譯器或解譯器在詞法分析時無法將其轉換為適當的程式語言。在編譯語言中,語法錯誤一定只在編譯期時出現,編譯器要所有的語法都正確,才能正確編譯。不過直譯語言中的語法錯誤可能要到運行期才會出現,而且不一定容易區分語法錯誤及語義錯誤。早期8位家用電腦的用戶界面是BASIC解釋器,SYNTAX ERROR錯誤訊息常造成用戶的困擾,只要解釋器無法識別用戶的輸入,就會出現此一訊息。若計算器中輸出不正確的算式,也會出現語法錯誤,例如算式中有左括弧但沒有右括弧、或是一個數字中有多個小數點等。
在Java語言中,以下的程式是正確的:
System.out.println("Hello World");
以下的程式不正確:
System.out.println(Hello World);
第二個程式理論上要顯示的是叫作Hello World的變數,而不是Hello World這個字,且Java語言的變數名稱中不可有空白,因此會出現語法錯誤。編譯器會標示程式中有語法錯誤的行,可能也會有簡單的說明。
異常處理
異常指的是在程式運行過程中發生的異常事件,通常是由硬體問題或者程式設計問題所導致的。
異常處理,是程式語言或計算機硬體里的一種機制,用於處理軟體或信息系統中出現的異常狀況(即超出程式正常執行流程的某些特殊條件)。
各種程式語言在處理異常方面具有非常顯著的不同點(錯誤檢測與異常處理區別在於:錯誤檢測是在正常的程式流中,處理不可預見問題的代碼,例如一個調用操作未能成功結束)。某些程式語言有這樣的函式:當輸入存在非法數據時不能被安全地調用,或者返回值不能與異常進行有效的區別。例如,C語言中的atoi函式(ASCII串到整數的轉換)在輸入非法時可以返回0。在這種情況下編程者需要另外進行錯誤檢測(可能通過某些輔助全局變數如C的errno),或進行輸入檢驗(如通過正則表達式),或者共同使用這兩種方法。
通過異常處理,我們可以對用戶在程式中的非法輸入進行控制和提示,以防程式崩潰。
從進程的視角,硬體中斷相當於可恢復異常,雖然中斷一般與程式流本身無關。
從子程式編程者的視角,異常是很有用的一種機制,用於通知外界該子程式不能正常執行。如輸入的數據無效(例如除數是0),或所需資源不可用(例如檔案丟失)。如果系統沒有異常機制,則編程者需要用返回值來標示發生了哪些錯誤。
錯誤處理規則
開發程式時應該遵循下列錯誤處理規則:①程式開始就應該選定一種錯誤處理模型,並一致地用選定的模型來處理錯誤。 ②對於返回值模型和全局錯誤標誌模型 ,出錯語句後緊跟錯誤處理塊,以便改善此類模型的結構問題。 ③對於恢復性模型,保證 On Error Goto lineno 語句所指代碼塊位於其後,最好是將方法中的所有錯誤處理塊放在方法的尾部。不使用或少使用 On Error Resume Next 語句。④對於恢復性和限制性模型,強調對所有可能出現錯誤的語句塊進行錯誤處理,但是,由於這兩種模型所拋出的錯誤 (異常 )對象可以向上傳遞,因此並不要求在每個方法內進行錯誤處理。 一般情況下,應該對一個事件中的代碼,兩個人機互動之間的代碼進行錯誤捕捉。 在編制 COM組件時,向外輸出的方法中也應該進行錯誤捕捉 ,並拋出錯誤 (異常 )對象 。