亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Delphi > 正文

異常和錯誤處理(基于Delphi/VCL)

2019-11-18 18:49:44
字體:
來源:轉載
供稿:網友
   有人在看了我的“如何將界面代碼和功能代碼分離(基于Delphi/VCL)”之后,提到一個問題,就是如何對服務端的類的錯誤進行處理。
    在基于函數的結構中,我們一般使用函數返回值來標明函數是否成功執行,并給出錯誤類型等信息。于是就會有如下形式的代碼:
    RetVal := SomeFunctionToOpenFile();

    if RetVal = E_SUCCESSED then
        ......
    else if RetVal = E_FILENOTFOUND then
        ......
    else if RetVal = E_FILEFORMATERR then
        ......
    else then
        ......
    使用返回錯誤代碼的方法是非常普遍的,但是使用這樣的方法存在2個問題:
    1、造成冗長、繁雜的分支結構(大量的if或case語句),使得控制流程變得復雜
    2、可能會有沒有被處理的錯誤(函數調用者如果不判斷返回值的話)
       
    而異常是對于錯誤處理的面向對象的解決方案。它可以報告錯誤,但需要知道的是,并非由于錯誤而引發了異常,而僅僅是因為使用了raise。
    在Object Pascal中,拋出異常使用的是raise保留字。在任何時候(即使沒有錯誤發生),raise都將會導致異常的發生。
   
    異??梢允沟么a從異常發生處立刻返回,從而保護其下面的敏感代碼不會得到執行。通過異常從函數返回和正常從函數返回(執行到函數末尾或執行了Exit)對于拋出異常的函數本身來說是沒有什么區別的。區別在于調用者處,通過異常返回后,執行權會被調用者的try...except塊所捕獲(如果它們存在的話)。如果調用者處沒有try...except塊的話,將不會繼續執行后續語句,而是返回更上層的調用者,直至找到能夠處理該異常的try...except塊。異常被處理后,將繼續執行try...except塊之后的語句,控制權就被留在了處理異常的這一層。當異常處理程序感覺對異常的處理還不夠完整時,需要更上層調用者繼續處理,可以重新拋出異常(使用簡單的raise;即可)將控制權交給更上層調用者。
    如果根本就沒有預設try...except塊,則最終異常會被最外層的封裝整個程序的VCL的try...except塊所捕獲。
    因此,不會有不被處理的異常,換句話說,也就是不會有不被處理的錯誤(雖然錯誤和異常并不能劃等號)。這也是異常機制比使用返回錯誤代碼方法的優越之處。另外,異常被拋出后,其控制流程的走向非常清晰明了,不會造成流程失去控制的情況。
   
    舉個例子說明異常的工作機制,假設我們要打開某種特定格式的文件:
    先定義兩個異常類(從Exception繼承)
    EFileNotFound = class(Exception);
    EFileFormatErr = class(Exception);
   
    假設Form1上有一個按紐,按下按紐即打開文件:
    PRocedure TForm1.Button1Click(Sender: TObject);
    begin
        try
            ToOpenFile();
        except
            on EFileNotFound do
                ShowMessage('Sorry, I can't find the file');
            on EFileFormatErr do
                ShowMessage('Sorry, the file is not the one I want');
            on E:Exception do
                ShowMessage(E.Message);
        end;
    end;
   
    以及打開文件的功能函數:
    procedure ToOpenFile;
    var RetVal:Integer;
    begin
        //Some code to openfile

        RetVal := -1; //open failed

        if RetVal = 0 then //success
            Exit

        else if RetVal = -1 then
            Raise EFileNotFound.Create('File not found')

        else if RetVal = -2 then
            Raise EFileFormatErr.Create('File format error')

        else //other error
            Raise Exception.Create('Unknown error');
    end;
   
    程序中 TForm1.Button1Click 調用ToOpenFile,并預設了對ToOpenFile可能拋出的異常處理的try...except。當然,也可以對 TForm1.Button1Click 的異常處理代碼進行簡化:
    procedure TForm1.Button1Click(Sender: TObject);
    begin
        try
            ToOpenFile();
        except
            ShowMessage('Open file failed');
        end;
    end;
   
    使用異常解決了使用返回錯誤代碼方法存在的問題,當然,使用異常也不是沒有代價的。異常會增加程序的負擔,因此濫用異常也是不可取的。寫若干try...except和寫數以千計的try...except之間是有很大區別的。用Chalie Calverts的話來說就是:“在似乎有用的時候,就應該使用try...except塊。但是要試著讓自己對這種技術的熱情不要太過頭”。
   
    另外,Object Pascal引入了獨特的try...finally結構。前面我說過,通過異常從函數返回和正常從函數返回是沒有什么區別的。因此,函數中的棧中的局部對象,會自動得到釋放,而堆中的對象則不會。而然,Object Pascal的對象模型是基于引用的,其存在于堆中,而非棧中。因此,有時我們在通過異常從函數返回之前需要清理一些局域的對象資源。try...finally正是解決這個問題的。
   
    我改寫了以上的 ToOpenFile 的代碼,這次讓ToOpenFile過程中使用了一些資源,并在異常發生后(或者不發生)從函數返回前都會釋放這些資源:
    procedure ToOpenFile;
    var RetVal: Integer;
        Stream: TStream;
    begin
        //Some code to openfile
        Stream := TStream.Create;
        RetVal := -1; //open failed

        try
            if RetVal = 0 then //success
                Exit

            else if RetVal = -1 then
                Raise EFileNotFound.Create('File not found')

            else if RetVal = -2 then
                Raise EFileFormatErr.Create('File format error')

            else //other error
                Raise Exception.Create('Unknown error');
        finally
            Stream.Free;
        end;
    end;
   
    單步執行以上代碼,可以看出,即使當RetVal的值為 0 時,執行Exit后,仍然會執行finally中的代碼,然后再從函數返回。由此保證了局部資源的正確釋放。
   
    try...except和try...finally的用途和使用場合是不同的,而很多初學者會將它們混淆。以下是筆者的一些個人認識:try...except一般用于調用者處捕獲所調用的函數所拋出的異常并進行處理。而try...finally一般用于拋出異常的函數本身進行一些資源清理工作。
   
    面向對象編程提供了“異常”這種錯誤處理的方案。善而用之,會對我們的工作有好處,可以顯著改善所編寫代碼的質量。
   
    Nicrosoft(nicrosoft@sunistudio.com)2001.7.25
    原文出處:東日文檔(http://www.sunistudio.com/asp/sunidoc.asp)


上一篇:用DELPHI實現特色按鈕

下一篇:在Delphi中處理數據庫日期型字段的顯示與輸入===>>>主窗口單元

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
學習交流
熱門圖片

新聞熱點

疑難解答

圖片精選

網友關注

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲大胆美女视频| 亚洲韩国日本中文字幕| 欧美性理论片在线观看片免费| 国产精品自产拍在线观看中文| 日韩欧美福利视频| 日韩有码在线视频| 伊人久久久久久久久久久久久| 97超级碰碰人国产在线观看| 色综合色综合网色综合| 国产欧美久久一区二区| 日韩av在线网站| 日韩成人在线免费观看| 26uuu日韩精品一区二区| 91亚洲午夜在线| 国产精品久久久久免费a∨| 欧美国产高跟鞋裸体秀xxxhd| 一区二区三区四区视频| 亚洲二区中文字幕| 91精品国产色综合久久不卡98口| 最新的欧美黄色| 亚洲精品欧美极品| 日韩成人av网| 亚洲国产精品嫩草影院久久| 欧美在线观看网址综合| 国产69精品久久久久9| 久久九九精品99国产精品| 亚洲精品免费在线视频| 国产亚洲精品久久久久久| 欧美性感美女h网站在线观看免费| 欧美性在线观看| 日韩电影免费观看在线观看| 久久天天躁狠狠躁夜夜躁2014| 91国产精品91| 色综合久久88色综合天天看泰| 精品高清一区二区三区| 日本免费一区二区三区视频观看| 精品久久久久久久久久ntr影视| 欧美午夜片欧美片在线观看| 国产69精品久久久久99| 欧美裸体男粗大视频在线观看| 久久福利视频网| 91香蕉亚洲精品| 热久久美女精品天天吊色| 麻豆一区二区在线观看| 欧美激情视频在线| 亚洲天堂男人天堂| 欧美理论电影网| 欧美午夜精品久久久久久久| 欧美成人午夜激情| 久久91超碰青草是什么| 91亚洲精品久久久久久久久久久久| 1769国内精品视频在线播放| 欧美肥老太性生活视频| 亚洲天堂av网| 亚洲aaa激情| 色综合视频一区中文字幕| 亚洲美女喷白浆| 国产激情久久久久| 亚洲激情视频在线| 日韩精品在线免费| 国产亚洲精品综合一区91| 欧美亚洲成人xxx| 欧美成人三级视频网站| 久久综合伊人77777尤物| 日韩中文字在线| www国产亚洲精品久久网站| 国产+人+亚洲| 欧美另类老肥妇| 成人网欧美在线视频| 在线国产精品视频| 成人字幕网zmw| 亚洲精品国产拍免费91在线| 国产亚洲一区二区精品| 欧美日韩成人在线视频| 国产精品高潮呻吟久久av黑人| 国产精品电影观看| 国产精品视频久久| 亚洲a级在线观看| 国产精品视频专区| 国产精品久久久久av免费| 一区二区成人精品| 久久久精品在线| 亚洲欧美色婷婷| 亚洲一区二区国产| 91精品久久久久久久久久久久久久| 亚洲美女中文字幕| 美女扒开尿口让男人操亚洲视频网站| 欧洲亚洲女同hd| 亚州av一区二区| 国产精品久久久久久av福利| 亚洲天堂免费观看| 国产一区二区视频在线观看| 91香蕉国产在线观看| 欧美日韩一区二区精品| 欧美精品日韩www.p站| 亚洲精品电影在线观看| 久久夜色精品亚洲噜噜国产mv| 亚洲国产精品成人va在线观看| www.日韩欧美| 国产日韩欧美中文在线播放| 欧美在线精品免播放器视频| 久久久99久久精品女同性| 成人做爰www免费看视频网站| 97久久精品人人澡人人爽缅北| 欧美xxxx18性欧美| 高清欧美性猛交xxxx| 国产精品香蕉av| 国产欧美日韩丝袜精品一区| 黑人巨大精品欧美一区二区三区| 国产成人福利网站| 中文字幕亚洲欧美一区二区三区| 日韩美女免费观看| www亚洲精品| 中文字幕在线日韩| 国产欧美韩国高清| 国产精品18久久久久久首页狼| 久久精品亚洲精品| 久久香蕉国产线看观看av| 国产亚洲欧洲黄色| 久久精品成人动漫| 久久久久久久影院| 97在线精品国自产拍中文| 亚洲国产精品yw在线观看| 欧美激情国产日韩精品一区18| 亚洲精品电影网站| 国产精品久久久久久久久借妻| 精品性高朝久久久久久久| 国产中文字幕91| 91久久精品美女高潮| 欧美一级电影在线| 国产精品福利在线观看网址| 欧美成人精品一区二区三区| 久久伊人91精品综合网站| 欧美久久精品一级黑人c片| 色老头一区二区三区| 午夜精品www| 国产成人亚洲综合青青| 中文字幕亚洲一区二区三区五十路| 欧美日韩成人黄色| 91精品久久久久久久久中文字幕| 色综久久综合桃花网| 成人观看高清在线观看免费| 久久人人爽亚洲精品天堂| 国产日韩欧美91| 91精品国产成人www| 91九色单男在线观看| 色噜噜国产精品视频一区二区| 欧美最猛性xxxx| 毛片精品免费在线观看| 日韩高清电影免费观看完整版| 亚洲成人网久久久| 亚洲第一av网| 国产精品一香蕉国产线看观看| 午夜免费日韩视频| 成人精品视频在线| 日韩美女免费线视频| 久久伊人免费视频| 国产精品影院在线观看| 久久久av亚洲男天堂| 欧美日韩国产二区| 国产成人精品999| 热久久视久久精品18亚洲精品| 亚洲mm色国产网站| 欧美激情一区二区久久久|