错误处理程序是所有严肃的程序的必要部分。但是在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. windows安装MySQL

    1)双击MySQL安装文件mysql-essential-5.0.82-win32.msi.进入欢迎页面. 单击Nextbutton.进入到安装类型页面. 2)在安装类型页面中的第一项是典型安装,第二 ...

  2. Xamarin移动跨平台解决方案是如何工作

    Xamarin移动跨平台解决方案是如何工作的? 概述 上一篇 C#移动跨平台开发(1)环境准备发布之后不久,无独有偶,微软宣布了开放.NET框架源代码并且会为Windows.Mac和Linux开发一个 ...

  3. VMware vCloud与Zend Server实现PHP应用程序自动化交付

    在巴塞罗那2013年VMworld大会上,开发商VMware公司和zend公司在云管理市场上大放异彩.两家公司的产品VMware vCloud和Zend Server组合,实现了PHP程序自动化交付. ...

  4. Inno Setup connection to the database and create

    原文 Inno Setup connection to the database and create Description: the first half of this program in I ...

  5. wcf事务(随记)

    ----------------------------------------------------wcf事务:1.ACID:原子性.一致性.隔离性.持久性:2.事务:添加命名空间(using S ...

  6. AppCompat v21 — Android 5.0之前版本设备的Material Design实现

    博客原文地址:http://android-developers.blogspot.com/2014/10/appcompat-v21-material-design-for-pre.html,要想打 ...

  7. Visual Studio 2013发布Cloud Service至Azure China

    Visual Studio 2013发布Cloud Service至Azure China <Windows Azure Platform 系列文章目录> 之前有很多网友询问我如何通过VS ...

  8. strus2 action重复执行问题

    近日做项目,有两个模块功能类似,就写到了一个action中,方法起名为getXXX1,getXXX2 最后在两个模块去调用的时候,分别调用DemoAction!getXXX1.action和DemoA ...

  9. Hashmat the brave warrior - UVa10055

    欢迎访问我的新博客:http://www.milkcu.com/blog/ 原文地址:http://www.milkcu.com/blog/archives/uva10055.html 题目描述 Pr ...

  10. 基于SQLite日志记录工具--Log4W

    最近压迫自己写点自己的东西,但是水平不高,槽点多,望各位请轻喷,嘿嘿! 以前用过一个Log4Net的东东,但是保存的是文本文件,不好过滤,而且用的不多,也不太熟悉,所以自己也当写一个练练手吧!     ...