Office中國(guó)論壇/Access中國(guó)論壇

 找回密碼
 注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

12下一頁(yè)
返回列表 發(fā)新帖
查看: 4825|回復(fù): 12
打印 上一主題 下一主題

[Access本身] 靈活運(yùn)用錯(cuò)誤處理

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
1#
發(fā)表于 2003-10-10 10:28:00 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
今天在愛(ài)賽思看見(jiàn)有討論如何處理錯(cuò)誤的,很有代表性,看來(lái)有一些初學(xué)者對(duì)錯(cuò)誤處理不是很清楚。而在兩個(gè)論壇上,有關(guān)錯(cuò)誤處理的討論也不是很多。所以,我就借此機(jī)會(huì),說(shuō)說(shuō)自己的一些體會(huì),希望能夠起到拋磚引玉之效。

在愛(ài)賽思,有提問(wèn)說(shuō),
1樓:setwarning 語(yǔ)句不能屏蔽error,有別的辦法嗎?
2樓回復(fù)說(shuō)
例子
Private Sub 命令6_Click()
On Error GoTo Err_命令6_Click
'////////////////////////////////
Exit_命令6_Click:
  Exit Sub
Err_命令6_Click:
  MsgBox Err.Description
  Resume Exit_命令6_Click   
End Sub

3樓回復(fù)說(shuō):
我覺(jué)得屏蔽error不是一個(gè)好注意!

屏蔽錯(cuò)誤這個(gè)問(wèn)題,要辯證地看。雖然“錯(cuò)誤”這個(gè)詞看上去蠻可怕的,但這只是人的感覺(jué)。有時(shí)候只是提醒,甚至是access本身設(shè)計(jì)不良。
1樓的同學(xué)想用setwarning來(lái)處理錯(cuò)誤,這就對(duì)不上號(hào)了。setwarning是處理系統(tǒng)信息,不是錯(cuò)誤。不要把兩個(gè)不同的概念弄混了。
2樓的同學(xué)摘錄了一段代碼,如果他把倒數(shù)第3條語(yǔ)句MsgBox Err.Description注釋掉,就回答了1樓的問(wèn)題。當(dāng)然,這樣的話,如果錯(cuò)誤導(dǎo)致某個(gè)紀(jì)錄不能被修改,用戶是不知道的了。顯然,這樣的屏蔽錯(cuò)誤方法不好。所以,重要的是需要知道什么樣的錯(cuò)誤發(fā)生,然后針對(duì)某種錯(cuò)誤,要做什么。
可以仔細(xì)研究一下access的err對(duì)象,非常有意思。err.Description是返回錯(cuò)誤的內(nèi)容,而err.number則返回錯(cuò)誤的號(hào)碼。這對(duì)編程非常有用。結(jié)合err的其他屬性,大多數(shù)情況下可以知道發(fā)生了什么類型的錯(cuò)誤,原因在那里,有什么影響。這樣,在on error語(yǔ)句捕捉到錯(cuò)誤以后,你就可以將err.number等輸出,分析不同錯(cuò)誤的種類,然后進(jìn)行處理。

為了更好的說(shuō)明我的觀點(diǎn),下面我舉個(gè)例子:
我有一個(gè)綁定紀(jì)錄的窗體,用FORM_beforeUpdate事件來(lái)提醒是否修改或者回滾用戶(Cancel=true, me.undo)的修改。但是,有一個(gè)問(wèn)題,當(dāng)用戶修改了紀(jì)錄,沒(méi)有保存或取消,而是直接點(diǎn)窗體右上角的X來(lái)關(guān)閉窗體,這時(shí)候,F(xiàn)ORM_beforeUpdate事件先觸發(fā),彈出提醒,如果用戶選擇不保存記錄,系統(tǒng)會(huì)產(chǎn)生一個(gè)錯(cuò)誤,客戶被告知更改數(shù)據(jù)庫(kù)時(shí)出現(xiàn)了一個(gè)錯(cuò)誤,如果關(guān)閉窗體,記錄將不會(huì)被保存。由于用戶確實(shí)是選擇取消修改的,所以系統(tǒng)的這個(gè)錯(cuò)誤信息是廢話,要屏蔽。在窗體FORM_error事件中,輸出錯(cuò)誤號(hào),是2169。所以,我就這樣改寫FORM_error事件:
Private Sub FORM_Error(DataErr As Integer, response As Integer)
Select Case DataErr
  Case 2169
    response = acDataErrContinue
  Case Else
    response = acDataErrDisplay
End Select
End Sub

如果錯(cuò)誤號(hào)是2169,那么就讓代碼繼續(xù)執(zhí)行,否則(就是其他我們目前還沒(méi)碰到的錯(cuò)誤),就顯示錯(cuò)誤信息。 這個(gè)處理方法,干脆利落,比增加一個(gè)關(guān)閉按鈕外加一大堆判斷邏輯要好得多。

那么,大家常碰到的按鈕單擊事件,如何改寫錯(cuò)誤代碼呢?
首先,還是按照標(biāo)準(zhǔn)的錯(cuò)誤處理過(guò)程,捕捉任何錯(cuò)誤,然后將錯(cuò)誤號(hào)和描述輸出:
Private Sub button1_Click()
On Error GoTo catch
  '這里是按鈕處理程序主體
finally:
  '一些清除工作,例如set myRecordSet = Nothing等
  Exit Sub
catch:
  MsgBox Err.Number & "/" & Err.Description
  Resume finally   
End Sub

如果產(chǎn)生了錯(cuò)誤,你也就知道了錯(cuò)誤號(hào)和描述,假定錯(cuò)誤號(hào)是513,然后你找一找原因。分析完畢后,知道了原因和如何處理之后,改寫代碼如下:
Private Sub button1_Click()
On Error GoTo catch
  '這里是按鈕處理程序主體
finally:
  '一些清除工作,例如set myRecordSet = Nothing等
  Exit Sub
catch:
  if Err.Number = 513 then
     '針對(duì)已知錯(cuò)誤的處理
  else
             '顯示未知錯(cuò)誤
    MsgBox Err.Number & "/" & Err.Description
  end if
  Resume finally   
End Sub

如果要處理數(shù)個(gè)錯(cuò)誤,當(dāng)然用select case...語(yǔ)句,注意要把最常發(fā)生的錯(cuò)誤放在前面,這樣可以提高程序的運(yùn)行效率。

更進(jìn)一步,可以創(chuàng)造錯(cuò)誤,讓其他程序去處理。例如,你有一個(gè)模塊,是處理用戶登陸的,這個(gè)模塊被數(shù)個(gè)其它窗體調(diào)用。如果用戶登陸過(guò)程當(dāng)中有什么不對(duì),那么最好的辦法就是讓這個(gè)模塊產(chǎn)生錯(cuò)誤,然后讓調(diào)用它的程序根據(jù)這個(gè)錯(cuò)誤決定采取什么樣的對(duì)策。

模塊程序
Public sub login(byVal userName As String, byVal pwd As String)
   '處理用戶登陸,例如核對(duì)用戶名、密碼、取得權(quán)限等
   If '用戶名不存在 then Err.Raise 513, "userLogin", "用戶不存在"
   If '密碼不對(duì) then Err.Raise 514, "userLogin", "錯(cuò)誤的密碼"
   If '沒(méi)能獲取權(quán)限 then Err.Raise 515, "userLogin", "沒(méi)有使用權(quán)限"
end sub

某個(gè)窗體調(diào)用時(shí),代碼看起來(lái)是這樣的
Private sub btnOk_click()
On Error Goto catch
    Call login(txtName, txtPwd)
    '進(jìn)入應(yīng)用程序,關(guān)閉本窗體
finally:
    exit sub
catch:
    MsgBox Err.D
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享分享 分享淘帖 訂閱訂閱
2#
 樓主| 發(fā)表于 2003-10-10 10:35:00 | 只看該作者
錯(cuò)誤信息真的不是敵人,它是程序員的好朋友。
3#
發(fā)表于 2003-10-10 16:01:00 | 只看該作者
很好!非常值的學(xué)習(xí)!
4#
發(fā)表于 2003-10-10 16:13:00 | 只看該作者
其實(shí)利用錯(cuò)誤捕捉也就相當(dāng)于
if,或select case 處理一樣的
只是換一了種判斷方式而已
另類一點(diǎn)
5#
發(fā)表于 2003-10-14 03:11:00 | 只看該作者
提示: 作者被禁止或刪除 內(nèi)容自動(dòng)屏蔽
6#
發(fā)表于 2006-1-1 05:56:00 | 只看該作者
謝謝 又學(xué)到東西了

呵呵

7#
發(fā)表于 2006-1-2 05:41:00 | 只看該作者
錯(cuò)誤信息是程序員的最好朋友。
8#
發(fā)表于 2006-1-4 04:26:00 | 只看該作者
我利用出錯(cuò)處理,解決了鏈接后臺(tái)數(shù)據(jù)庫(kù)的問(wèn)題。

以前沒(méi)有這樣做時(shí),如果變動(dòng)了放數(shù)據(jù)庫(kù)的盤符,老是出錯(cuò),叫你調(diào)試。

現(xiàn)在好了,利用出錯(cuò)處理,如果未鏈接,就會(huì)打開(kāi)“鏈接”窗體。

如果一經(jīng)鏈接,就不會(huì)叫你打開(kāi)“鏈接”窗體了。

這樣做對(duì)否,請(qǐng)高手指導(dǎo)。



Private Sub cmdLogin_Click()
   On Error GoTo Err_cmdLogin_Click
       Dim intA As Integer
      
       i = i + 1
         
     If DLookup("[密碼]", "用戶", "[用戶名]= """ & com用戶 & """") = txt密碼 Then
        msg = MsgBox("密碼正確,歡迎進(jìn)入!")
        DoCmd.close
        
    DoCmd.close acForm, "登陸背景", acSaveYes
   
    Dim stdocname As String
    Dim stLinkCriteria As String
    stdocname = ChrW(20027) & ChrW(25511) & ChrW(-26782) & ChrW(26495)
    DoCmd.OpenForm stdocname, , , stLinkCriteria
   
    Else
        If i < 3 Then
            MsgBox "密碼錯(cuò),請(qǐng)重新輸入!"
            txt密碼.Value = ""
            txt密碼.SetFocus
        Else
            MsgBox "密碼錯(cuò),禁止進(jìn)入!"
            Application.Quit
        End If
   
    End If
   
Exit_cmdLogin_Click:
    Exit Sub

Err_cmdLogin_Click:
   'MsgBox "未鏈接后臺(tái)數(shù)據(jù)庫(kù)!" & Chr(10) & Chr(10) & "請(qǐng)鏈接后臺(tái)數(shù)據(jù)庫(kù)。", vbExclamation + vbOKOnly, "提示信息"
   DoCmd.OpenForm "鏈接后臺(tái)數(shù)據(jù)庫(kù)", acNormal, "", "", , acNormal
   
    Resume Exit_cmdLogin_Click
End Sub

點(diǎn)擊這里給我發(fā)消息

9#
發(fā)表于 2006-1-4 05:20:00 | 只看該作者
不錯(cuò)的貼子,很有代表性
10#
發(fā)表于 2007-1-12 21:30:00 | 只看該作者
有些帖子雖然老,但是很經(jīng)典。希望大家多多學(xué)習(xí)提高!
您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則

QQ|站長(zhǎng)郵箱|小黑屋|手機(jī)版|Office中國(guó)/Access中國(guó) ( 粵ICP備10043721號(hào)-1 )  

GMT+8, 2024-10-23 08:31 , Processed in 0.121925 second(s), 33 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回復(fù) 返回頂部 返回列表