错误处理程序是所有严肃的程序的必要部分。但是在Lotus Notes开发中,很多程序员编写LotusScript代码时,并没有写专门的错误处理代码的习惯。这能够行得通,主要是因为LotusScript程序是嵌入在Notes客户端中执行的,出现错误时,客户端会报错,退出代码的执行,而不会崩溃。而用其他单独运行的语言开发时,很多错误处理程序就是简单将错误信息或者对用户更友好的解释显示出来,并让程序继续运行(没有它们,程序就会退出。)还有一个原因是,没有错误处理程序,LotusScript调试器迅速运行到出错的那一行;反之,则要程序员自己观察错误是由哪一行引起的。

尽管如此,在很多情况下,为LotusScript代码编写错误处理的部分仍然是必需的。有时候我们需要控制错误出现时的情况:给用户友好的提示,引导他们如何操作;根据不同的错误类型,做出调整或者继续运行程序的其余部分;记录错误信息到日志中等等。最后一种情况在服务器端运行的程序中尤为普遍。

大多数情况下,LotusScript中的错误处理程序和下面的代码类似:

Public Function Run()
On Error GoTo EH
'Run...
Exit Function
EH:
MsgBox "Error(" & Err() & "): " & Error() & " at line " & Erl() & " in function Run."
'Other possible actions.
Exit Function
End Function

它们的公共部分就是给出一个详细的错误信息,由错误号、对错误的描述、错误发生的代码行数和所在的函数名,以便程序员快速定位和排除错误。值得一提的是Erl()函数在脚本库的上下文里,给出的是出错代码在整个脚本库里的行号;在一个自定义类的上下文里,给出的是出错代码在整个类里的行号。Designer 8.5引入全新的基于Eclipse的LotusScript编辑器后,Erl()报出的行号一度不准确,和实际的错误行号相差2,以至于一些开发者退回使用老版本的编辑器。到版本9,这个问题已被修复。

每次都重复这样的代码当然繁琐无味。自然希望写一个通用的函数,之后每次要处理错误时调用即可。要这样做,唯一的问题就在于,如何在这个函数中给出出错的函数的名称,即上面的Run。幸好,LotusScript里有一个有用的函数GetThreadInfo(),可以返回很多正在运行当前LotusScript脚本的线程的信息,其中就包括,调用当前函数的模块和函数的名称。有了这个方便,我们的错误处理函数就可以写作如下:

%REM
Description: Common error handler. Return the detailed error message.
%END REM
Public Function GetErrorMsg() As String
Dim msg As String
'LSI_THREAD_CALLMODULE=11, LSI_THREAD_CALLPROC=10
msg = GetThreadInfo(11) & ">" & Getthreadinfo(10) & ": " & _
"Error(" & Err() & "): " & Error() & " at line "& Erl()
GetErrorMsg=msg
End Function

这个错误处理函数只返回一个详细描述错误的信息,而没有任何进一步的动作,就是为了给调用者最大的灵活性,可以将它打印出来,也可以写入日志。现在,我们上面的Run()函数就可以改写成:

Public Function Run()
On Error GoTo EH
'Run...
Exit Function
EH:
MsgBox GetErrorMsg()
'Other possible actions.
Exit Function
End Function

34. LotusScript中的错误处理程序的更多相关文章

  1. asp.net发布到IIS中出现错误:处理程序“PageHandlerFactory-Integrated”在其模块列表中有一个错误模块“ManagedPipelineHandler”

    asp.net发布到IIS中出现错误:处理程序“PageHandlerFactory-Integrated”在其模块列表中有一个错误模块“ManagedPipelineHandler” http:// ...

  2. 关于错误处理程序中【return】的用法

    先让俺这位新人帮各位有幸游览到我博客文章的叔叔阿姨哥哥姐姐们解释一下什么是错误处理?即:当程序发生错误时,保证程序不会异常中断的机制. 那么为什么程序中会有错误处理呢?像我们通常无论是玩手机或者玩游戏 ...

  3. 错误:“ResourceDictionary”根元素需要 x:Class 特性来支持 XAML 文件中的事件处理程序。请移除 MouseLeftButtonDown 事件的事件处理程序.

    原文:错误:"ResourceDictionary"根元素需要 x:Class 特性来支持 XAML 文件中的事件处理程序.请移除 MouseLeftButtonDown 事件的事 ...

  4. PHP中的错误处理、异常处理机制详解

    在编写PHP程序时,错误处理是一个重要的部分.如果程序中缺少错误检测代码,那么看上去很不专业,也为安全风险敞开了大门 例: <?php $a = fopen('test.txt','r'); / ...

  5. javascript中的错误处理机制

    × 目录 [1]对象 [2]类型 [3]事件[4]throw[5]try[6]常见错误 前面的话 错误处理对于web应用程序开发至关重要,不能提前预测到可能发生的错误,不能提前采取恢复策略,可能导致较 ...

  6. oracle数据库出现“批处理中出现错误: ORA-00001: 违反唯一约束条件”解决方法

    最近使用oraclede impdp工具全库导入数据库时,在数据库里面使用出现如下情况. SQL state : 违反唯一约束条件 (GDXAORCL.SYS_C0055359) ; nested e ...

  7. 【LabVIEW技巧】LabVIEW中的错误2

    前言 通过上一个文章的介绍,我们发现LabVIEW自带的错误管理依旧比较基础,如果需要对错误进行很好的管理,则需要进一步的进行程序编写. 用于在程序设计的过程中,为了保证程序的健壮性,我们需要 1.忽 ...

  8. Team Foundation 中的错误和事件消息

    Visual Studio Team System Team Foundation 中的错误和事件消息 Team Foundation 通过显示错误消息和事件消息来通知您操作成功以及操作失败.一部分错 ...

  9. Playbooks 中的错误处理

    Topics Playbooks 中的错误处理 忽略错误的命令 控制对失败的定义 覆写更改结果 Ansible 通常默认会确保检测模块和命令的返回码并且会快速失败 – 专注于一个错误除非你另作打算. ...

随机推荐

  1. Premiere Pro CC问题集,不断更新

    1.Premiere Pro CC不好用? 是的.原因如下: 1.1 Adobe公司不注重用户体验,不注重工作流程,导致这款软件的用户体验很差,设计也很烂.对比Adobe公司当年用户体验最好的软件 F ...

  2. CSS3 Media Queries 详细介绍与使用方法

    Media Queries 就是要在支援CSS3 的浏览器中才能正常工作,IE8 以下不支持. 而Media Queries 的套用方法千变万化,要套用在什么样的装置中,都可以自己来定义. 到底什么是 ...

  3. 几乎没用到过的css 样式

    1. :focus  选择器用于选取获得焦点的元素. 案例:http://www.w3school.com.cn/tiy/t.asp?f=css_sel_focus 2. clearfix清除浮动闭合 ...

  4. 解决nexus下载maven索引的问题

    解决nexus下载maven索引的问题 (2011-10-12 17:48:46) 转载▼ 标签: it 分类: java 转自 http://www.colorfuldays.org/program ...

  5. 赠书《JavaScript高级程序设计(第三版)》5本

    本站微博上正在送书<JavaScript高级程序设计>走过路过的不要错过,参与方式,关注本站及简寻网+转发微博:http://weibo.com/1748018491/DoCtp6B8r ...

  6. CodeSmith开发系列资料总结

    CodeSmith开发系列资料总结 最近跟同事在研究CodeSmith,感觉中文文档是少之又少,所以我们自己写(翻译)了一些文档,总结如下,希望对使用CodeSmith的朋友有所帮助: “努力学习的熊 ...

  7. bootstrap + angularjs + seajs构建Web Form前端(1)

    bootstrap + angularjs + seajs构建Web Form前端(一) 简介 Bootstrap是Twitter推出的一个用于前端开发的开源工具包,它由Twitter的设计师Mark ...

  8. Foundation 学习笔记

    笔记内容 学习笔记-段玉磊 Stanford course Foundation and Attributed Strings Dynamic binding id 是一个指向任何未知对象的指针,(t ...

  9. 大数据和Hadoop生态圈

    大数据和Hadoop生态圈 一.前言: 非常感谢Hadoop专业解决方案群:313702010,兄弟们的大力支持,在此说一声辛苦了,经过两周的努力,已经有啦初步的成果,目前第1章 大数据和Hadoop ...

  10. 解决Timer回调方法重复调用的问题

    如果Timer的回调方法的执行时间很长,计时器可能在上个回调方法还没有完成的时候再次触发,如果我们只是想让一个回调方法执行完后再执行下一个回调方法,可以这样: private static Timer ...