【2.Delphi语法基础】7.程序异常处理
7.程序異常處理
Delphi對應用程序中產生的異常定義在SysUtils、DB、ComCtrl等多個庫單元中。
7.1Object Pascal異常基類
Delphi中,所有異常的基類是Exception類。其主要屬性和方法如下:
1.屬性
-
HelpContext
HelpContext是ThelpContext類的實例,提供了與異常對象聯系在一起的上下文相關幫助信息的序列號。該序列號決定當發生異常時,用戶按F1鍵顯示的異常錯誤的幫助信息。
-
Message
存儲異常發生時的錯誤信息。可以通過該屬性在提示錯誤對話框中顯示錯誤信息字符串。
2.方法
-
Create(Const Msg: string)
該方法用來產生一個具有簡單提示信息的對話框,對話框中的提示信息由Msg提供。
-
CreateFmt(Const Msg: string, Const Args: Array of Const)
該方法用來產生一個具有格式化字符串提示信息的對話框,格式化字符串由Msg和Args提供。如:CreateFmt('%dbu z %d..%d范圍內', [100, 0, 99]),產生”100不在0..99范圍內“。
-
CreateHelp(Const Msg: string, AhelpContext: Integer)
該方法產生一個具有簡單提示信息和上下文幫助序列號的提示對話框,其中:Msg參數時顯示在異常對話框中的提示信息,AhelpContext參數是異常錯誤信息上下文幫助序列號。
7.2Delphi內建異常類
Delphi內建異常類很多,下面表格列出常見的Delphi內建異常類:
| EAbort | 程序遇到錯誤但不彈出對話框 |
| EAccessViolation | 無效內存訪問錯誤 |
| EAssertionFailed | 執行Assert過程返回值是False |
| EControlC | 在控制臺中,按【Ctrl】+【C】組合鍵遇到錯誤 |
| EConvertError | 在字符串或其他對象集轉換時遇到錯誤 |
| EDivByZero | 整數除數是0 |
| EinOutError | 輸入/輸出錯誤 |
| EIntOverflow | 整數運算時,結果超過變量定義范圍 |
| EMathError | 浮點運算出現錯誤 |
| EOutOfMemory | 超出內存錯誤 |
| EOverflow | 浮點運算返回結果超出變量定義范圍 |
| ErangeError | 整數數值超出變量定義范圍,例如數組下標越界 |
| EStackOverflow | 堆棧溢出錯誤 |
| EWin32ErrorWindows | 錯誤 |
| EzeroDivide | 浮點運算除數是0 |
| EdatabaseError | 數據庫錯誤,在數據庫中定義 |
| EupdateError | 數據集提供者錯誤,在數據庫中定義 |
| EADOError | ADO數據庫錯誤,在adodb庫中定義 |
| EDBEngineError | 出現BDE錯誤,在dbtables庫中定義 |
| EnoResultSet | 沒有成功打開一個數據集查詢 |
7.3自定義異常類
雖然Delphi已經有很多內建的異常類,但有時滿足不了應用需求,此時,可以自行定義異常類,自定義異常類必須繼承內建異常類。以下舉例說明校驗年齡數據的正確性,年齡限制在0~99之間。
運行時界面如下圖所示:
?
代碼如下:
implementation ? {$R *.dfm} ? typeVerifyAgeError = class(Exception) ? ? ? ? // 自定義異常類function toAge(age: integer): integer;end; ? function VerifyAgeError.toAge(age: integer): integer; beginif (age >= 100) or (age < 0) thenshowmessage('年齡不符合實際!');result := abs(age) mod 99; end; ? // 校驗按鈕事件處理 procedure TForm1.Button1Click(Sender: TObject); vara: integer; begintrya := strtoint(Edit1.Text);if (a >= 100) or (a < 0) then raise VerifyAgeError.Create('年齡錯誤');messagedlg('OK', mtinformation, [mbok], 0);excepton e: EConvertError domessagedlg(e.Message, mterror, [mbok], 0);on e: VerifyAgeError dobeginmessagedlg(e.Message, mterror, [mbok], 0);Edit1.Text := inttostr(e.toAge(strtoint(Edit1.Text)));end;end; end; ? // 退出按鈕事件處理 procedure TForm1.Button2Click(Sender: TObject); beginclose; end; ? end.7.4觸發異常
異常觸發可以分為兩種:一種是程序系統自動觸發,另一種是執行raise指令觸發。如上面的代碼中,EConvertError異常就是由系統在執行字符串轉換整型數值的時候自動觸發的,而VerifyAgeError是當年齡不在指定范圍內時通過raise指令手動觸發的。
raise指令的語法格式:
raise 異常對象再次舉例說明,以下例子通過輸入兩次密碼相同或不同的情況進行處理。
運行時界面如下圖所示:
?
代碼如下:
implementation ? {$R *.dfm} ? typeEPasswordInvalid = class(Exception); ? procedure TForm1.Button1Click(Sender: TObject); beginif edit1.Text <> edit2.Text thenraise EPasswordInvalid.Create('密碼輸入有誤!')elsebeginshowmessage('密碼設置完成!');end;showmessage('歡迎光臨!'); end; ? end.7.5異常捕獲
在Object Pascal程序語言中,有兩種用來處理異常的語句:
-
try...finally...end
-
try...except...end
1.try...finally...end
語法格式:
try<被保護語句> finally <異常處理語句> //無論異常發生否,都必須處理 end;該語句處理異常,只要觸發異常,系統自動捕捉被觸發的異常,然后以信息對話框的方式顯示異常信息,讓程序避開發生異常的代碼,然后繼續向下執行。
這種異常處理結構一般用于保護系統資源分配等方面,它確保了無論try體內的代碼是否發生異常,都需要由系統進行最后的統一處理一些對系統對象的正確處理。
和try…except…end不同,該結構的finally部分總被執行。在try-finally語句中,當try部分產生異常后,應用程序直接執行Finally部分的資源釋放語句。
示例:
運行時界面如下圖所示:
?
示例代碼:
implementation ? {$R *.dfm} ? procedure TForm1.Button1Click(Sender: TObject); vari: ^integer;res, y: double; begintrynew(i);i^ := strtoint(edit1.Text);y := 3.1415926;res := y/i^;label1.Caption := '3.1415926 div ' + inttostr(i^) + ' = ' + floattostr(res);finallyshowmessage('現在釋放i^的內存');dispose(i);end; end; ? end.2.try...except...end
語法格式:
try<被保護語句> except 異常處理語句 //異常不發生,不處理 end; 或 try<被保護語句> excepton <異常對象類型1> do <語句1> //捕獲指定類型的異常對象,進行處理......on <異常對象類型n> do <語句n> //捕獲指定類型的異常對象,進行處理else<語句n+1> //缺省的異常處理代碼 end;在try體內的代碼發生異常時,系統將轉向except部分進行異常的處理。這是Delphi處理異常的最基本的方式之一。try語句塊指出了需要進行異常保護的代碼。如果在這部分有不正常的事件發生,則引發一個異常對象。except是異常處理部分,被保護部分引發的異常對象將執行<異常處理語句>或由這部分代碼捕獲并進行處理。
使用該語句處理異常時,會根據異常的類型不同,對異常做不同的處理。
在前面的自定義異常代碼示例中已經使用過該語句,所以在此不再舉例。
總結
以上是生活随笔為你收集整理的【2.Delphi语法基础】7.程序异常处理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 斜视 能考驾照吗
- 下一篇: flutter需要定义product f