第十二章異常處理與程序調(diào)試(一)_第1頁(yè)
第十二章異常處理與程序調(diào)試(一)_第2頁(yè)
第十二章異常處理與程序調(diào)試(一)_第3頁(yè)
第十二章異常處理與程序調(diào)試(一)_第4頁(yè)
第十二章異常處理與程序調(diào)試(一)_第5頁(yè)
已閱讀5頁(yè),還剩10頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、在應(yīng)用程序開(kāi)發(fā)中如何檢測(cè)、處理程序的運(yùn)行錯(cuò)誤是一個(gè)很重要的問(wèn)題。在 Delphi 的集成開(kāi)發(fā)環(huán)境( IDE )中提供了一個(gè)完善的內(nèi)置調(diào)試器,可以幫助你發(fā)現(xiàn)大部分程序錯(cuò)誤。但并不是所有的錯(cuò)誤都可以被發(fā)現(xiàn),而且當(dāng)程序涉及到與外設(shè)的數(shù)據(jù)交換或操作外設(shè),如要求用戶輸入、讀寫(xiě)磁盤(pán)等時(shí),錯(cuò)誤的發(fā)生是程序無(wú)法控制的,如輸入非法字符、磁盤(pán)不能讀寫(xiě)等。這些情況不僅會(huì)導(dǎo)致應(yīng)用程序異常中止而且可能引起系統(tǒng)的崩潰。針對(duì)這些問(wèn)題,Delphi同時(shí)提供了一套強(qiáng)大的異常處理機(jī)制。巧妙地利用它,可以使你的程序更為強(qiáng)健,使用更為友好。雖然Delphi為應(yīng)用程序提供了一套缺省的自動(dòng)異常處理機(jī)制,即當(dāng)前模塊發(fā)生錯(cuò)誤后退出當(dāng)前模塊并

2、給出錯(cuò)誤信息,而并不立即引起應(yīng)用程序的中止。但當(dāng)應(yīng)用程序執(zhí)行的過(guò)程性很強(qiáng)時(shí),僅僅利用這種方法是不夠的,而且很容易導(dǎo)致程序執(zhí)行的不可預(yù)測(cè)性。12.1Delphi異常處理機(jī)制與異常類(lèi)Delphi異常處理機(jī)制建立在保護(hù)塊(Protected Blocks)的概念上。所謂保護(hù)塊是用保留字try和end封裝的一段代碼。保護(hù)塊的作用是當(dāng)應(yīng)用程序發(fā)生錯(cuò)誤時(shí)自動(dòng)創(chuàng)建一個(gè)相應(yīng)的異常類(lèi)(Exception)。程序可以捕獲并處理這個(gè)異常類(lèi),以確保程序的正常結(jié)束以及資源的釋放和數(shù)據(jù)不受破壞。如果程序不進(jìn)行處理,則系統(tǒng)會(huì)自動(dòng)提供一個(gè)消息框。異常類(lèi)是Delphi異常處理機(jī)制的核心,也是Delphi異常處理的主要特色。下面

3、我們對(duì)異常類(lèi)的概念和體系進(jìn)行詳細(xì)的介紹。Delphi提供的所有異常類(lèi)都是類(lèi)Exception的子類(lèi)。用戶也可以從Exception派生一個(gè)自定義的異常類(lèi)。Exception類(lèi)的定義如下,對(duì)于不常用的成員沒(méi)有列出。SysUtils 單元中Exception = class(TObject)privateFMessage: PString;FHelpContext: Longint;function GetMessage: String;procedure SetMessage(const Value: String);publicconstructor Create(const Msg: Str

4、ing);constructor CreateFmt(const Msg: String; const Args: array of const);. . . destructor Destroy; override;property HelpContext: Longint property Message: String;property MessagePtr: PString;end;Exception的一系列構(gòu)造函數(shù)中最重要的參數(shù)是顯示的錯(cuò)誤信息。而數(shù)據(jù)成員中最重要的也是可被引用的消息字符串(message,messagePtr)。 這些信息分別對(duì)自定義一個(gè)異常類(lèi)和處理一個(gè)異常類(lèi)有重要

5、作用。Delphi提供了一個(gè)很龐大的異常類(lèi)體系,這些異常類(lèi)幾乎涉及到編程的各個(gè)方面。從大的方面我們可以把異常類(lèi)分為運(yùn)行時(shí)間庫(kù)異常、對(duì)象異常、部件異常三類(lèi)。下面我們分別進(jìn)行介紹。12.1.1 運(yùn)行時(shí)間庫(kù)異常類(lèi)(RTL Exception)運(yùn)行時(shí)間庫(kù)異常可以分為七類(lèi),它們都定義在SysUtils庫(kù)單元中。12.1.1.1 I/O異常I/O異常類(lèi)EInOutError是在程序運(yùn)行中試圖對(duì)文件或外設(shè)進(jìn)行操作失敗后產(chǎn)生的,它從Exception派生后增加了一個(gè)公有數(shù)據(jù)成員ErrorCode,用于保存所發(fā)生錯(cuò)誤的代碼。這一成員可用于在發(fā)生I/O異常后針對(duì)不同情況采取不同的對(duì)策。當(dāng)設(shè)置編譯指示$I- 時(shí),不

6、產(chǎn)生I/O異常類(lèi)而是把錯(cuò)誤代碼返回到預(yù)定義變量IOResult中。12.1.1.2 堆異常堆異常是在動(dòng)態(tài)內(nèi)存分配中產(chǎn)生的,包括兩個(gè)類(lèi)EOutOfMemory和EInvalidPointer。表12.1堆異常類(lèi)及其產(chǎn)生原因異常類(lèi) 引發(fā)原因EOutOfMemory 沒(méi)有足夠的空間用于滿足所要求的內(nèi)存分配EInvalidPointer 非法指針。一般是由于程序試圖去釋放一個(gè)業(yè)已釋放的指針而引起的12.1.1.3整數(shù)異常整數(shù)異常都是從一個(gè)EIntError類(lèi)派生的,但程序運(yùn)行中引發(fā)的總是它的子類(lèi):EDivByZero,ERangeError,EIntOverFlow。 表12.2整數(shù)異常及其產(chǎn)生原因異

7、常類(lèi) 引發(fā)原因EDivByZero 試圖被零除ERangeError 整數(shù)表達(dá)式越界EIntOverFlow 整數(shù)操作溢出ERangeError當(dāng)一個(gè)整數(shù)表達(dá)式的值超過(guò)為一個(gè)特定整數(shù)類(lèi)型分配的范圍時(shí)引發(fā)。比如下面一段代碼將引發(fā)一個(gè)ERangeError異常。varSmallNumber: ShortInt;X , Y: Integer;beginX := 100;Y := 75;SmallNumber := X * Y;end;特定整數(shù)類(lèi)型包括ShortInt、Byte以及與整數(shù)兼容的枚舉類(lèi)型、布爾類(lèi)型等。例如:typeTHazard = ( Safety , Marginal , Criti

8、cal , Catastrophic );varHaz: THazard;Item: Integer;beginItem:= 4;Haz:= THazard ( Item );end;由于枚舉數(shù)越界而引發(fā)一個(gè)ERangeError異常。數(shù)組元素越界也會(huì)引發(fā)一個(gè)ERangeError異常,如:varValues: array1.10 of Integer;i: Integer;beginfor i := 1 to 11 doValuesi := i;end;ERangeError異常只有當(dāng)類(lèi)型檢查打開(kāi)時(shí)才會(huì)引發(fā)。這可以在代碼中包含$R+ 編譯指示或設(shè)置IDE Option|Project的Ran

9、ge_Checking Option選擇框。EIntOverFlow異常類(lèi)在Integer、Word、Longint三種整數(shù)類(lèi)型越界時(shí)引發(fā)。如:varI : Integer;a,b,c : Word; begina := 10;b := 20;c := 1;for I := 0 to 100 dobeginc := a*b*c;end;end;引發(fā)一個(gè)EIntOverFlow異常。EIntOverFlow異常類(lèi)只有在編譯選擇框Option|Project|Over_Flow_Check Option選中時(shí)才產(chǎn)生。當(dāng)關(guān)閉溢出檢查,則溢出后變量保留該類(lèi)整數(shù)的最大范圍值。整數(shù)類(lèi)型的范圍如下表。 表1

10、2.3 整數(shù)類(lèi)型的范圍類(lèi)型 范圍 格式 Shortint -128 . 127 有符號(hào)8位Integer -32768 . 32767 有符號(hào)16位Longint -2147483648 . 2147483647 有符號(hào)32位Byte 0 . 255 無(wú)符號(hào)8位Word 0 . 65535 無(wú)符號(hào)16位12.1.1.4 浮點(diǎn)異常浮點(diǎn)異常是在進(jìn)行實(shí)數(shù)操作時(shí)產(chǎn)生的,它們都從一個(gè)EMathError類(lèi)派生,但與整數(shù)異常相同,程序運(yùn)行中引發(fā)的總是它的子類(lèi)EInvalidOp、EZeroDivide、EOverFlow、EUnderFlow。 表12.4浮點(diǎn)異常類(lèi)及其引發(fā)原因異常類(lèi) 引發(fā)原因EInval

11、idOp 處理器碰到一個(gè)未定義的指令EZeroDivide 試圖被零除EOverFlow 浮點(diǎn)上溢EUnderFlow 浮點(diǎn)下溢EInvalidOp最常見(jiàn)的引發(fā)原因是沒(méi)有協(xié)處理器的機(jī)器遇到一個(gè)協(xié)處理器指令。由于在缺省情況下Delphi總是把浮點(diǎn)運(yùn)算編譯為協(xié)處理器指令,因而在386以下微機(jī)上常常會(huì)碰到這個(gè)錯(cuò)誤。此時(shí)只需要在單元的接口部分設(shè)置全局編譯指示$N-,選擇利用運(yùn)行時(shí)間庫(kù)進(jìn)行浮點(diǎn)運(yùn)算,問(wèn)題就可以解決了。各種類(lèi)型的浮點(diǎn)數(shù)(Real、Single、Double、Extended)越界引起同樣的溢出異常。這同整數(shù)異常類(lèi)是不同的。12.1.1.5 類(lèi)型匹配異常類(lèi)型匹配異常EInvalidCast當(dāng)

12、試圖用As 操作符把一個(gè)對(duì)象與另一類(lèi)對(duì)象匹配失敗后引發(fā)。12.1.1.6 類(lèi)型轉(zhuǎn)換異常類(lèi)型轉(zhuǎn)換異常EConvertError當(dāng)試圖用轉(zhuǎn)換函數(shù)把數(shù)據(jù)從一種形式轉(zhuǎn)換為另一種形式時(shí)引發(fā),特別是當(dāng)把一個(gè)字符串轉(zhuǎn)換為數(shù)值時(shí)引發(fā)。下面程序中的兩條執(zhí)行語(yǔ)句都將引發(fā)一個(gè)EConvertError異常。varrl : Real;int: Integer;beginrl := StrToFloat(' $140.48');int := StrToInt(' 1,402 ');end;要注意并不是所有的類(lèi)型轉(zhuǎn)換函數(shù)都會(huì)引發(fā)EConvertError異常。比如函數(shù)Val當(dāng)它無(wú)法完成字符

13、串到數(shù)值的轉(zhuǎn)換時(shí)只把錯(cuò)誤代碼返回。利用這一點(diǎn)我們?cè)?6.2)節(jié)中實(shí)現(xiàn)了輸入的類(lèi)型和范圍檢查。12.1.1.7 硬件異常硬件異常發(fā)生的情況有兩種:或者是處理器檢測(cè)到一個(gè)它不能處理的錯(cuò)誤,或者是程序產(chǎn)生一個(gè)中斷試圖中止程序的執(zhí)行。硬件異常不能編譯進(jìn)動(dòng)態(tài)鏈接庫(kù)(DLLs)中,而只能在標(biāo)準(zhǔn)的應(yīng)用中使用。硬件異常都是EProcessor異常類(lèi)的子類(lèi)。但運(yùn)行時(shí)間并不會(huì)引發(fā)一個(gè)EProcessor 異常。 表12.5硬件異常類(lèi)及其產(chǎn)生原因異常類(lèi) 引發(fā)原因Efault 基本異常類(lèi)。是其它異常類(lèi)的父類(lèi)EGPFault 一般保護(hù)錯(cuò)。通常由一個(gè)未 初始化的指針或?qū)ο笠餎StackFault 非法訪問(wèn)處理器的棧段E

14、PageFault Windows內(nèi)存管理器不能正確使用交換文件EInvalidOpCode 處理器碰到一個(gè)未定義的指令。這通常意味著處理器試圖去操作非法數(shù)據(jù)或未初始化的內(nèi)存EBreakPoint 應(yīng)用程序產(chǎn)生一個(gè)斷點(diǎn)中斷ESingleStep 應(yīng)用程序產(chǎn)生一個(gè)單步中斷EFault、EGPFault 往往意味著致命的錯(cuò)誤。而EBreakPoint、ESingleStep被Delphi IDE的內(nèi)置調(diào)試器處理。事實(shí)上前邊的五種硬件異常的響應(yīng)和處理對(duì)開(kāi)發(fā)者來(lái)說(shuō)都是十分棘手的問(wèn)題。12.1.2 對(duì)象異常類(lèi)所謂對(duì)象異常是指非部件的對(duì)象引發(fā)的異常。Delphi定義的對(duì)象異常包括流異常、打印異常、圖形異常

15、、字符串鏈表異常等。12.1.2.1 流異常類(lèi)流異常類(lèi)包括EStreamError、EFCreateError、 EFOpenError、EFilerError、EReadError、EWriteError、EClassNotFound。它們的結(jié)構(gòu)關(guān)系如下:EStreamError|- EFCreateError|- EFOpenError|- EFilerError|- EReadError|- EWriteError|- EClassNotFound 圖12.1 流異常結(jié)構(gòu)圖流異常在Classes庫(kù)單元中定義。流異常引發(fā)的原因如表12.6。表12.6流異常類(lèi)及其產(chǎn)生原因異常類(lèi) 引發(fā)原因ES

16、treamError 利用LoadFromStream方法讀一個(gè)流發(fā)生錯(cuò)誤EFCreateError 創(chuàng)建文件時(shí)發(fā)生錯(cuò)誤EFOpenError 打開(kāi)文件時(shí)發(fā)生錯(cuò)誤EFilerError 試圖再次登錄一個(gè)存在的對(duì)象EReadError ReadBuffer方法不能讀取特定數(shù)目的字節(jié)EWriteError WriteBuffer方法不能寫(xiě)特定數(shù)目的字節(jié)EClassNotFound 窗口上的部件被從窗口的類(lèi)型定義中刪除12.1.2.2 打印異常類(lèi)打印異常類(lèi)EPrinter當(dāng)打印發(fā)生錯(cuò)誤時(shí)引發(fā)。它在printers庫(kù)單元中定義。例如你的應(yīng)用程序試圖向一個(gè)不存在的打印機(jī)打印或由于某種原因打印工作無(wú)法送到

17、打印機(jī)時(shí),就會(huì)產(chǎn)生一個(gè)打印異常。12.1.2.3 圖形異常類(lèi)圖形異常類(lèi)定義在Graphic 庫(kù)單元中,包括EInvalidGraphic和EInvalidGraphicOperation兩類(lèi)。EInvalidGraphic當(dāng)應(yīng)用程序試圖從一個(gè)并不包含合法的位圖、圖標(biāo)、元文件或用戶自定義圖形類(lèi)型的文件中裝入圖形時(shí)引發(fā)。例如下面的代碼:Image1.Picture.LoadFromFile('Readme.txt');由于Readme.txt并不包含一個(gè)合法的圖形,因而將引發(fā)一個(gè)EInvalidGraphic異常。EInvalidGraphicOperation當(dāng)試圖對(duì)一個(gè)圖形進(jìn)行

18、非法操作時(shí)引發(fā)。例如試圖改變一個(gè)圖標(biāo)的大小。varAnIcon: TIcon;beginAnIcon := TIcon.Create;AnIcon.LoadFromFile('C:WINDOWSDIRECTRY.ICO');AnIcon.Width := 100; 引發(fā)一個(gè)圖形異常 .12.1.2.4 字符串鏈表異常字符串鏈表異常EStringListError、EListError在用戶對(duì)字符串鏈表進(jìn)行非法操作時(shí)引發(fā)。由于許多部件(如TListBox,TMemo,TTabSet,)都有一個(gè)TStrings類(lèi)的重要屬性,因而字符串鏈表異常在部件操作編程中非常有用。EString

19、ListError異常一般在字符串鏈表越界時(shí)產(chǎn)生。例如對(duì)如下初始化的列表框:ListBox1.Items.Add('First item'); ListBox1.Items.Add('Second item'); ListBox1.Items.Add('Third item'); 則以下操作都會(huì)引起EStringListError異常:ListBox1.Item3 := ' Not Exist'str := ListBox1.Item 3;EListError異常一般在如下兩種情況下引發(fā):1.當(dāng)字符串鏈表的Duplicates屬性

20、設(shè)置為dupError時(shí),應(yīng)用程序試圖加入一個(gè)重復(fù)的字符串;2.試圖往一個(gè)排序的字符串鏈表中插入一個(gè)字符串。12.1.3 部件異常類(lèi)12.1.3.1 通用部件異常類(lèi)通用部件異常類(lèi)常用的有三個(gè):EInvalidOperation、EComponentError、EOutOfResource。其中EInvalidOperation、EOutOfResource在Controls單元中定義;EComponentError在Classes單元中定義。1.非法操作異常 EInvalidOperationEInvalidOperation 引發(fā)的原因可能有: 應(yīng)用程序試圖對(duì)一個(gè)Parent屬性為nil的部

21、件進(jìn)行一些需要Windows句柄的操作 試圖對(duì)一個(gè)窗口進(jìn)行拖放操作 操作違反了部件屬性間內(nèi)置的相互關(guān)系等例如,ScrollBar、Gauge等部件要求Max屬性大于等于Min屬性,因而下面的語(yǔ)句:ScrollBar1.Max := ScrollBar1.Min-1; 將引發(fā)一個(gè)EInvalidOperation異常。2.部件異常EComponentError引發(fā)該異常的原因可能有: 在Register過(guò)程之外試圖登錄一個(gè)部件(常用于自定義部件開(kāi)發(fā)中) 應(yīng)用程序在運(yùn)行中改變了一個(gè)部件的名稱(chēng)并使該部件與另一個(gè)部件重名 一個(gè)部件的名稱(chēng)改變?yōu)橐粋€(gè)Object Pascal非法的標(biāo)識(shí)符 動(dòng)態(tài)生成一個(gè)部件

22、與已存在的另一部件重名3.資源耗盡異常EOutOfResource當(dāng)應(yīng)用程序試圖創(chuàng)建一個(gè)Windows句柄而Windows 卻沒(méi)有多余的句柄分配時(shí)引發(fā)該異常。12.1.3.2 專(zhuān)用部件異常類(lèi)許多部件都定義了相應(yīng)的部件異常類(lèi)。但并不是有關(guān)部件的任何錯(cuò)誤都會(huì)引發(fā)相應(yīng)的異常類(lèi)。許多情況下它們將引發(fā)一個(gè)運(yùn)行時(shí)間異常或?qū)ο螽惓?。下面列出幾個(gè)典型的部件異常類(lèi)。1.EMenuError非法的菜單操作,例如試圖刪除一個(gè)不存在的菜單項(xiàng)。這一異常類(lèi)在Menus庫(kù)單元中定義。2.EInvalidGridOpertion非法的網(wǎng)格操作,比如試圖引用一個(gè)不存在的網(wǎng)格單元。這一異常類(lèi)在Grids庫(kù)單元中定義。3.EDDE

23、ErrorDDE異常。比如應(yīng)用程序找不到特定的服務(wù)器或會(huì)話,或者一個(gè)聯(lián)接意外中止。這一異常類(lèi)在DDEMan庫(kù)單元中定義。4.EDatabaseError,EReportError數(shù)據(jù)庫(kù)異常(EDatabaseError)和報(bào)表異常(EReportError) 在進(jìn)行數(shù)據(jù)庫(kù)和報(bào)表操作出現(xiàn)錯(cuò)誤時(shí)引發(fā)。有關(guān)數(shù)據(jù)庫(kù)的問(wèn)題請(qǐng)讀者參閱本書(shū)第二編。12.1.4 小結(jié)在這一節(jié)中重點(diǎn)介紹了Delphi提供的異常類(lèi)體系。我們力求給讀者一個(gè)清晰、全面的印象,使讀者能在自己的程序開(kāi)發(fā)中實(shí)際使用它們。為便于理解我們也提供了一些簡(jiǎn)單的說(shuō)明性示例。雖然在具體的使用中讀者還可能會(huì)碰到許多問(wèn)題,但意識(shí)到應(yīng)該用異常類(lèi)來(lái)增強(qiáng)程序的

24、健壯性卻是程序設(shè)計(jì)水平走上新臺(tái)階的標(biāo)志。12.2 異常保護(hù)確保回收分配的資源是程序健壯性的一個(gè)關(guān)鍵。但缺省情況下異常發(fā)生時(shí)程序會(huì)在出錯(cuò)點(diǎn)自動(dòng)退出當(dāng)前模塊,因此需要一種特殊的機(jī)制來(lái)確保即使在異常發(fā)生的情況下釋放資源的語(yǔ)句仍能被執(zhí)行。而Delphi的異常處理正提供了這種機(jī)制。12.2.1 需要保護(hù)的資源一般說(shuō)來(lái)需要保護(hù)的資源包括: 文件 內(nèi)存 Windows資源 對(duì)象比如下面一段程序就會(huì)造成1K內(nèi)存資源的丟失。varAPointer : Pointer ;AInt , ADiv: Integer ;beginADiv := 0;GetMem ( APointer , 1024 );AInt :=

25、10 div ADiv ;FreeMem ( Apointer , 1024 );end;由于程序從異常發(fā)生點(diǎn)退出從而FreeMem永遠(yuǎn)沒(méi)有執(zhí)行的機(jī)會(huì)。12.2.2 產(chǎn)生一個(gè)資源保護(hù)塊Delphi提供了一個(gè)保留字finally,用于實(shí)現(xiàn)資源的保護(hù):分配資源try資源使用情況finally釋放資源end;tryfinallyend就形成了一個(gè)資源保護(hù)塊。finally后面的語(yǔ)句是在任何情況下,不論程序是否發(fā)生異常,都會(huì)執(zhí)行的。對(duì)于(12.2.1)中的例子如下代碼即可確保所分配內(nèi)存資源的釋放:varAPointer : Pointer ;AInt , ADiv : Integer;beginADiv := 0;GetMem ( APointer , 1024 );tryAInt := 10 div ADiv ;finallyFreeMem ( Apointer , 1024 );end;end;下面的例子摘自(6.4)節(jié),是在文件拷貝中實(shí)現(xiàn)文件資源的保護(hù):procedure CopyFile(const FileName, DestName: TFileName);varCopyBuffer: Pointer; TimeStamp, BytesCopied: Longint;Source, Dest: Integer; Destinati

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論