精华区 [关闭][返回]

当前位置:网易精华区>>讨论区精华>>编程开发>>● 群件>>个人专集>>chchen专集>>程序?程序——2

主题:程序?程序——2
发信人: cvchen()
整理人: kamkam(2002-07-11 10:50:46), 站内信件
可能我所说的只是入门的东东,根本不值得一提。如果不敢兴趣的话,不看也罢。

前面提过,错误的处理是很重要的一部分。
那么,首先我们看一下,错误一般有哪些处理方法(这里的如果不加说明,我都讲LotusScript,如果要别的话):
Msgbox
Print
如果再想全一点,就是写数据LOG库和文件了。
如果光是下面这一段程序,可能就以下这些提示就行了:
Sub Initialize
On Error Goto Err_Agent_Initialize
Dim appTitle As String
'Declaration

appTitle = "代理操作"
'Operation
'...

Exit_Agent_Initialize:
Exit Sub

Err_Agent_Initialize:
'Get Error Message
Msgbox appTitle + "(" + Cstr(Erl) + "): " + Error
'You can use Print instead of Msgbox
' Print appTitle + "(" + Cstr(Erl) + "): " + Error
Resume Exit_Agent_Initialize
End Sub
appTitle的作用是一旦函数多的时候,可以及时知道是哪个函数段的错误,再加上ERL,就可以快速定位到错误的行了。

不过,现在开发的版本,可能C/S和B/S都要调用,如何考虑怎样打印错误?是不是就得拷贝两份?我们增加一些错误判断。
Sub Initialize
On Error Goto Err_Agent_Initialize
Dim appTitle As String
Dim ns As New NotesSession
'Declaration

appTitle = "代理操作"
debugLevel = "" '初始化, 万一连下面这一句都会出错了
debugLevel = ns.GetEnvironmentString("DebugLevel") '如果是服务器端代理,这里可以用服务器的notes.ini设置
'Operation
'...

Exit_Agent_Initialize:
Exit Sub

Err_Agent_Initialize:
'Get Error Message
Select Case debugLevel
Case "1":
Msgbox appTitle + "(" + Cstr(Erl) + "): " + Error
Case "0":
Print appTitle + "(" + Cstr(Erl) + "): " + Error
Case Else:
End Select
Resume Exit_Agent_Initialize
End Sub

下面来进一步讨论,如果我们要写得长一点的程序,比如要对通讯录里面的所有人员进行操作,就自动根据人员的组织单元,生成所有人员的部门吧。

作为规范的考虑,首先想到写函数,甚至放在ScriptLib中;一个很普通的办法就是同时可以使用C/S或B/S代理去调用。
判断要做的事情:
1 获取公用通讯录 *;
2 获取用户;
3 获取用户的部门信息,如“张三/办公室/单位”,可以取出“办公室” *;
4 查找“办公室”群组是否存在,
  - 不存在,创建;
  - 存在,查找该用户是否在该群组中;不存在添加。

根据通用性考虑,1和3可以(打*号)需要建函数,我们来先来考虑一下GetNAB。
Function GetNAB(dbSource As NotesDatabase) As String
'当然函数也可以这样写,但是一旦出错,错误信息就无从获取了。
'Function GetNAB(dbSource As NotesDatabase) As NotesDatabase
On Error Goto Err_GetNAB
Dim appTitle As String
Dim ns As New NotesSession
appTitle = "获取通讯录"
GetNAB = ""
If Isarray(ns.AddressBooks) Then
Set dbSource = Nothing '一个无聊的问题,如果这一句和If换一下,会有什么效果差异?
Forall book In ns.AddressBooks
If Not(book.IsPrivateAddressBook) Then '以前我用If book.IsPublicAddressBook Then的。
Set dbSource = book
Call dbSource.Open("", "")
If dbSource.IsOpen Then '冗余错误
'成功了,执行到最后退出...
Else
GetNAB = appTitle + ": 打开通讯录失败!"
End If
Exit Forall
End If
End Forall
Else
GetNAB = appTitle + ": 无法获取通讯录, 通讯录为空!"
End If

Exit_GetNAB:
Exit Function
Err_GetNAB:
GetNAB = appTitle + "(" + Cstr(Erl) + "): " + Error
Resume Exit_GetNAB
End Function
这里仅仅将错误信息作为GETNAB的返回参数。这样就可以分别在不同的代理中调用:
Notes客户端调用:
Sub Initialize
Dim runInfo As String
Dim dbName As NotesDatabase

runInfo = GetNAB(dbName)
If runInfo = "" Then
'正确的话, 继续运行...
Else
'错误
MsgBox runInfo, 48, "系统提示"
End If
End Sub
浏览器上调用:
Sub Initialize
Dim runInfo As String
Dim sucessLink As String, errorLink As String
Dim dbName As NotesDatabase

successLink = "操作成功!<HR><A HREF='/'>主页"
errorLink = "<HR><A HREF='/'>主页  <A HREF='javascript:history.back()'>返回"
runInfo = GetNAB(dbName)
If runInfo = "" Then
'正确的话, 继续运行...
Print successLink
Else
'错误
Print "错误信息: " + runInfo
Print errorLink
End If
End Sub

以上的函数的大致考虑,我不知道多少人会去写类,类的错误信息考虑方式又会不一样。下次讨论吧。


----
要交流合作的话,给我写信吧。

[关闭][返回]