




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、. 第二十章 用WHENEVER語句捕獲錯(cuò)誤本章講解怎樣在INFORMIX-4GL程序中進(jìn)行錯(cuò)誤檢測(cè)。程序開發(fā)過程中有有兩種錯(cuò)誤:編編譯錯(cuò)誤和運(yùn)行錯(cuò)誤。l l 編譯錯(cuò)誤:在程序中若含有一個(gè)或多個(gè)不正確的語法會(huì)發(fā)生編譯錯(cuò)誤。發(fā)生編譯錯(cuò)誤INFORMIX-4GL會(huì)為.4gl文件標(biāo)出語法錯(cuò)誤,你可以通過糾正標(biāo)出的語法錯(cuò)誤并重新編譯,直到編譯成功,從而解決編譯錯(cuò)誤。l l 運(yùn)行錯(cuò)誤:運(yùn)行錯(cuò)誤發(fā)生在程序運(yùn)行時(shí),且會(huì)因各種條件引起。例如:可能是某個(gè)文件沒找到,或插入到SMALLINT類型字段的值太大。開發(fā)程序時(shí),要
2、考慮到可能發(fā)生的運(yùn)行錯(cuò)誤并想法處理。本章就要講怎樣識(shí)別這些情況的類型及怎樣處理。缺省地,當(dāng)INFORMIX-4GL或SQL語句失敗程序會(huì)中斷。發(fā)生了運(yùn)行錯(cuò)誤會(huì)導(dǎo)致程序不可預(yù)料的失敗。INFORMIX-4GL中,有辦法改變?nèi)笔?dòng)作,即當(dāng)SQL或INFORMIX-4GL語句執(zhí)行失敗時(shí)讓程序繼續(xù)執(zhí)行下去,然后當(dāng)缺省動(dòng)作被改變后,由程序員檢測(cè)給定語句是成功還是失敗,測(cè)定是否發(fā)生了錯(cuò)誤。在所有INFORMIX-4GL語句執(zhí)行后,Status被設(shè)置值,若其值為0,則語句執(zhí)行成功;若為負(fù)數(shù)值,語句執(zhí)行失敗。在SQL語句執(zhí)行后,依據(jù)SQL語名執(zhí)行成功與否,Status和SQLCA.SQLCODE同時(shí)等于零或負(fù)
3、數(shù)。 注意失敗語句產(chǎn)生的負(fù)值都對(duì)應(yīng)有錯(cuò)誤信息,在以后章節(jié)將講到怎樣訪問錯(cuò)誤信息。 捕獲錯(cuò)誤本章提供的例子說明了怎樣用Status或SQLCA.SQLCODE捕獲運(yùn)行錯(cuò)誤,但首先我們還是先看看怎樣用WHENEVER語句避免發(fā)生錯(cuò)誤。WHENEVER語句用于當(dāng)錯(cuò)誤發(fā)生時(shí)對(duì)程序轉(zhuǎn)向執(zhí)行。它指示程序:l l 當(dāng)錯(cuò)誤發(fā)生時(shí)停止l l 忽略錯(cuò)誤,進(jìn)繼續(xù)執(zhí)行l(wèi) l 發(fā)生錯(cuò)誤時(shí)調(diào)用函數(shù) WHENEVER ERROR STOP它打印出錯(cuò)誤信息,并中止程序執(zhí)行,這是程序的缺省狀態(tài)。 WHENEVER ERROR CONTINUE當(dāng)錯(cuò)誤發(fā)生時(shí)繼續(xù)執(zhí)行。當(dāng)用這個(gè)語句時(shí)在每個(gè)可能
4、發(fā)生錯(cuò)誤的語句后面進(jìn)行錯(cuò)誤檢查是非常重要的。 WHENEVER ERROR CALL 函數(shù)名這個(gè)語句在錯(cuò)誤發(fā)生時(shí)執(zhí)行指定函數(shù),當(dāng)想建立自己的情況檢測(cè)過程時(shí)用此形式。注意此函數(shù)不能傳遞參數(shù)。WHENEVER語句有三個(gè)最一般的格式。上圖列出了其完整的語法。ANY保留字和WHENEVER WARNING子句在下面討論。NOTFOUND子句將在其它章節(jié)講到。推薦不使用GOTO子句。INFORMIX-4GL 4.1版中有ANY保留字。若加了WHENEVER ANY,則在計(jì)算表達(dá)式值、檢測(cè)SQL語句、屏幕I/O語句和數(shù)據(jù)有效性語句之后對(duì)statas變量賦值。WHENEVER WARNING與WH
5、ENEVER ERROR一樣,只是它在每個(gè)4GL語句后都檢測(cè)SQLAWARN1是否被設(shè)為W。語句的不同類型:編譯開關(guān)大部分INFORMIX-4GL語句是運(yùn)行命令。例如MENU是顯示菜單結(jié)構(gòu)的運(yùn)行命令,WHENEVER語句與其它INFORMIX-4GL語句不同,它是編譯開關(guān)。編譯開關(guān)用于指示編譯器而不是程序,它告訴編譯器對(duì)可能引起錯(cuò)誤的語句怎樣處理。例如,若使用省缺的STOP,則編譯器在所有可能引起錯(cuò)誤的語句周圍插入代碼。當(dāng)運(yùn)行時(shí)發(fā)生了錯(cuò)誤,擴(kuò)展的代碼將顯示錯(cuò)誤信息,并中止程序。用WHENEVER改變編譯在4GL程序中加入WHENEVER語句,實(shí)際上選擇了另一種編譯開關(guān),換句話說,由你指示編譯器
6、在發(fā)生錯(cuò)誤時(shí)做什么。 程序?qū)嵗?#160;globals "cust_globs.4gl" function input_cust()input by name gr_customer.*on key (control-e)clear formlet gr_customer.* = nr_customer.*next field fnameend input let gr_customer.customer_num = 0由于沒有WHENEVER語句,使用缺省的STOP。INSERT中發(fā)生了錯(cuò)誤,則程序中斷。insert into custo
7、mer values(gr_customer.*) end function function delete_cust()whenever error continueDELETE語句發(fā)生了錯(cuò)誤將繼續(xù)往下執(zhí)行。delete from customer where customer.customer_num = gr_customer.customer_num由于設(shè)置了WHENEVER ERROR CONTINUE,就要對(duì)所有SQL語句檢測(cè)SQLCA.SQLCODE值。if sqlca.sqlcode <0 thenerror sqlca.sqlcode using &
8、quot;-<<<<", " has occurred."elsemessage "This row has been deleted."end ifend function function update_cust() update customer set (customer.*) = (gr_customer.*)where customer.customer_num =gr_customer.customer_num end functionglobals "cust_gl
9、obs.4gl" 由于input_cust函數(shù)使用了whenever error call db_error,則以后檢測(cè)到錯(cuò)誤發(fā)生,編譯器會(huì)檢測(cè)SQLCA.SQLCODE的值,當(dāng)小于零時(shí)調(diào)用db_error函數(shù)。function input_cust()whenever error call db_errorinput by name gr_customer.*on key (control-e)clear formlet gr_customer.* = nr_customer.*next field fnameend input let gr_customer.
10、customer_num = 0 insert into customervalues(gr_customer.*) end function function delete_cust() delete from customerwhere customer.customer_num = gr_customer.customer_numend function function update_cust() update customer set (customer.*) = (gr_customer.*)where customer.custo
11、mer_num =gr_customer.customer_num end function WHENEVER語句是模塊有效的。編譯器在編譯代碼時(shí)為WHENEVER語句使用最后的設(shè)置。從上圖例子中的cust_edit.4gl模塊看,你可能認(rèn)為不會(huì)有錯(cuò)誤檢測(cè),這是很常見的錯(cuò)誤概念。記住若沒有WHENEVER語句,缺省的是WHENEVER ERROR STOP。在cust_add .4gl模塊中,若在REPORT cust_list中發(fā)生錯(cuò)誤,仍繼續(xù)執(zhí)行。這是因?yàn)閃HENEVER的最后設(shè)置是CONTINUE。若在函數(shù)FUNCTION update_cust中發(fā)生錯(cuò)誤,程序?qū)⒅袛?/p>
12、。這是因?yàn)樵谶@個(gè)模塊中無WHENEVER語句,而缺省的是STOP。在INFORMIX-4GL語言中有一些錯(cuò)誤處理庫(kù)函數(shù)。用它們可以在屏幕上顯示與錯(cuò)誤信息相關(guān)的錯(cuò)誤號(hào)、或把它寫向文件、或既在屏幕上顯示又寫到文件中。在4GL原代碼中也可以通過CALL語句加入這些函數(shù)。但在SQL語句中不能用這些函數(shù)。finderr工具finderr工具可以在終端上顯示錯(cuò)誤信息。它不是4GL庫(kù)函數(shù)。在命令行上用下面語法執(zhí)行:finderr msg_num 注意錯(cuò)誤信息列在INFORMIX-4GL參考手冊(cè)第二卷的后面。err_print函數(shù)用于從INFORMIX-4GL錯(cuò)誤信息庫(kù)檢索錯(cuò)誤信息。它計(jì)算接收的值,
13、并找到相應(yīng)的錯(cuò)誤信息,然后顯示在錯(cuò)誤行。傳給err_print函數(shù)的值必須是負(fù)數(shù)。如上圖例子中,把全局變量SQLCA.SQLCODE的值傳給了err_print函數(shù)。err_quit函數(shù)用于從INFORMIX-4GL錯(cuò)誤信息庫(kù)檢索錯(cuò)誤信息。它計(jì)算接收的值,并找到相應(yīng)的錯(cuò)誤信息,由4GL在錯(cuò)誤行顯示這些信息。err_quit與err_print不同之處是:一但錯(cuò)誤信息顯示出來,程序就中斷了。傳給err_quit的值必須是負(fù)數(shù)。上圖例子中,把全局變量SQLCA.SQLCODE的值傳給了err_quit函數(shù)。當(dāng)應(yīng)用執(zhí)行完后,你可能想查看發(fā)生的錯(cuò)誤信息,這可查看錯(cuò)誤日志文件并查找最近發(fā)生的錯(cuò)誤;也可以
14、修改程序來捕獲指定錯(cuò)誤。加入錯(cuò)誤日志的三個(gè)函數(shù)l l Startlogl l err_getl l errorlog下一頁(yè)舉了這三個(gè)函數(shù)的例子。上圖例子中說明了錯(cuò)誤日志函數(shù)的使用方法。l l Startlog:在主程序中調(diào)用這個(gè)函數(shù)用于初始化日志文件,若引號(hào)中指定的文件不存在,將會(huì)創(chuàng)建它;若文件存在,日志文件中的所有語句將追加到已有文件中。l l err_get:這個(gè)函數(shù)用于檢索錯(cuò)誤信息并把它存放在字符變量中。在上圖例子中,errvar定義為80個(gè)字符長(zhǎng)的字符變量,err_get函數(shù)根據(jù)參數(shù)SQLCA.SQLCODE的值,把錯(cuò)誤信息返回給errvar變量。l lerrorlog:這個(gè)函數(shù)向錯(cuò)誤
15、日志文件中寫入信息。在上圖例子中,變量errvar通過err_get函數(shù)接收錯(cuò)誤信息,并被寫到錯(cuò)誤日志文件error_file中。errorlog函數(shù)會(huì)自動(dòng)地把錯(cuò)誤發(fā)生的日期和時(shí)間寫到錯(cuò)誤日志文件中。程序?qū)嵗篻lobals "cust_globs.4gl" function input_cust()define errvar char(80)此變量取得err_get函數(shù)返回的錯(cuò)誤語句。 input by name gr_customer.*on key (control-e)clear formlet gr_customer.* = nr_custom
16、er.*next field fnameend input let gr_customer.customer_num = 0 whenever error continue insert into customervalues(gr_customer.*) 當(dāng)錯(cuò)誤發(fā)生時(shí),從err_get函數(shù)取得錯(cuò)誤消息,并用ERROR語句顯示給用戶。if sqlca.sqlcode <0 thenlet errvar = err_get(sqlca.sqlcode)error errvarcall errorlog(errvar clipped)returnelsemess
17、age "Row has been added."end if end function function delete_cust()delete from customerwhere customer.customer_num = gr_customer.customer_numif sqlca.sqlcode <0 thencall err_print(sqlca.sqlcode)returnelsemessage "This row has been deleted."end ifend function 錯(cuò)誤檢
18、測(cè)的方式有多種,具體用哪種要依據(jù)應(yīng)用決定。一般,在開發(fā)周期完成前不做錯(cuò)誤檢測(cè)。在程序有錯(cuò)時(shí)中斷程序,以便執(zhí)行適當(dāng)?shù)拇a避免錯(cuò)誤。錯(cuò)誤檢測(cè)并不意味著替換不良的編碼標(biāo)準(zhǔn)。WHENEVER ERROR CONTINUE語句最好用于檢查你控制不了的特殊錯(cuò)誤。如你要修改的行被其它用戶鎖住了或沒有對(duì)數(shù)據(jù)進(jìn)行修改及查看的權(quán)限,這時(shí)發(fā)生的錯(cuò)誤就是這類的。WHENEVER ERROR CONTINUE語句是非常有用的,若語句失敗了,且后面沒再提供錯(cuò)誤檢查,程序會(huì)不留痕跡地進(jìn)行下去。因此,好的編程習(xí)慣是在WHENEVER ERROR CONTINUE和WHENEVER ERROR STOP語句之前加上提供錯(cuò)誤檢測(cè)的語句。如下頁(yè)的例子。練習(xí):globals "cust_globs.4gl" function input_cust()input by name gr_customer.*on key (control-e)clear formlet gr_customer.* = nr_customer.*next field fnameend i
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年上虞大學(xué)面試題及答案
- 2025年上海高口筆試題目及答案
- 2026屆江西省尋烏縣市級(jí)名校中考試題猜想語文試卷含解析
- 馮諾依曼教學(xué)課件
- 2025國(guó)家能源集團(tuán)清潔能源研究院有限公司系統(tǒng)內(nèi)招聘12人筆試參考題庫(kù)附帶答案詳解(10套)
- 新地理教師教學(xué)課件模板
- 2025年新密市財(cái)源投資集團(tuán)有限公司招聘15人筆試參考題庫(kù)附帶答案詳解(10套)
- 2025四川遂寧市射洪市財(cái)政局市屬國(guó)有企業(yè)招聘考生及筆試參考題庫(kù)附帶答案詳解(10套)
- don't-drop-it課件教學(xué)課件
- 2025湖南省保安協(xié)會(huì)工作人員招聘2人筆試參考題庫(kù)附帶答案詳解(10套)
- 2025年經(jīng)濟(jì)人員面試題及答案
- 銷售管理辦法細(xì)則
- 防火宣傳課件
- 四川阿壩州郵政招聘試題帶答案分析2024年
- 疼痛的中醫(yī)治療課件
- 2025年操作工技能考核考試-高級(jí)壓縮機(jī)工歷年參考題庫(kù)含答案解析(5套100道單選題合輯)
- 兒童咳嗽健康宣教
- 電氣安全防護(hù)技術(shù)課件
- CRTS-III型板式無砟軌道施工工藝
- 2025至2030年中國(guó)溫差發(fā)電行業(yè)市場(chǎng)全景調(diào)研及發(fā)展趨向研判報(bào)告
- 標(biāo)準(zhǔn)化工程師試題8篇
評(píng)論
0/150
提交評(píng)論