34. LotusScript中的错误处理程序
错误处理程序是所有严肃的程序的必要部分。但是在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中的错误处理程序的更多相关文章
- asp.net发布到IIS中出现错误:处理程序“PageHandlerFactory-Integrated”在其模块列表中有一个错误模块“ManagedPipelineHandler”
asp.net发布到IIS中出现错误:处理程序“PageHandlerFactory-Integrated”在其模块列表中有一个错误模块“ManagedPipelineHandler” http:// ...
- 关于错误处理程序中【return】的用法
先让俺这位新人帮各位有幸游览到我博客文章的叔叔阿姨哥哥姐姐们解释一下什么是错误处理?即:当程序发生错误时,保证程序不会异常中断的机制. 那么为什么程序中会有错误处理呢?像我们通常无论是玩手机或者玩游戏 ...
- 错误:“ResourceDictionary”根元素需要 x:Class 特性来支持 XAML 文件中的事件处理程序。请移除 MouseLeftButtonDown 事件的事件处理程序.
原文:错误:"ResourceDictionary"根元素需要 x:Class 特性来支持 XAML 文件中的事件处理程序.请移除 MouseLeftButtonDown 事件的事 ...
- PHP中的错误处理、异常处理机制详解
在编写PHP程序时,错误处理是一个重要的部分.如果程序中缺少错误检测代码,那么看上去很不专业,也为安全风险敞开了大门 例: <?php $a = fopen('test.txt','r'); / ...
- javascript中的错误处理机制
× 目录 [1]对象 [2]类型 [3]事件[4]throw[5]try[6]常见错误 前面的话 错误处理对于web应用程序开发至关重要,不能提前预测到可能发生的错误,不能提前采取恢复策略,可能导致较 ...
- oracle数据库出现“批处理中出现错误: ORA-00001: 违反唯一约束条件”解决方法
最近使用oraclede impdp工具全库导入数据库时,在数据库里面使用出现如下情况. SQL state : 违反唯一约束条件 (GDXAORCL.SYS_C0055359) ; nested e ...
- 【LabVIEW技巧】LabVIEW中的错误2
前言 通过上一个文章的介绍,我们发现LabVIEW自带的错误管理依旧比较基础,如果需要对错误进行很好的管理,则需要进一步的进行程序编写. 用于在程序设计的过程中,为了保证程序的健壮性,我们需要 1.忽 ...
- Team Foundation 中的错误和事件消息
Visual Studio Team System Team Foundation 中的错误和事件消息 Team Foundation 通过显示错误消息和事件消息来通知您操作成功以及操作失败.一部分错 ...
- Playbooks 中的错误处理
Topics Playbooks 中的错误处理 忽略错误的命令 控制对失败的定义 覆写更改结果 Ansible 通常默认会确保检测模块和命令的返回码并且会快速失败 – 专注于一个错误除非你另作打算. ...
随机推荐
- Installshield获取安装包版本的系统变量是IFX_PRODUCT_VERSION
原文:Installshield获取安装包版本的系统变量是IFX_PRODUCT_VERSION Installshield获取安装包版本的系统变量为IFX_PRODUCT_VERSION 当笔记记下 ...
- 关于Office 中的墨迹功能(可作word电子签名)
原文 关于Office 中的墨迹功能 通过使用 Microsoft Office 2003 中的墨迹功能,可使用 Tablet PC 和 Tablet 笔将手写笔记插入到 Microsoft Offi ...
- sql点滴37—mysql中的错误Data too long for column '' at row 1
原文:sql点滴37-mysql中的错误Data too long for column '' at row 1 1.MYSQL服务 我的电脑——(右键)管理——服务与应用程序——服务——MYSQ ...
- C# 根据年、月、周、星期获得日期等
原文:C# 根据年.月.周.星期获得日期等 /// 取得某月的第一天 /// </summary> /// <param name="datetime">要 ...
- [译]JVM运行时数据区
(本篇文章翻译自JVM Run-Time Data Areas) 这是我阅读JVM规范的笔记,而且我画了一个图来帮助我理解. 1.每一个单独的线程(非共享的)的数据区 针对每一个单独的线程的数据区包括 ...
- Dotfuscator自定义规则中的元素选择
Dotfuscator是专业的.NET程序代码保护软件.是支持规则自定义的,你可以对重命名.程序控制流.字符串加密等等功能自定义规则.在进行规则自定义过程中,可以通过元素的不同选择,满足自己的程序需要 ...
- Vs2010中水晶报表引用及打包
原文:Vs2010中水晶报表引用及打包 转自:http://yunhaifeiwu.iteye.com/blog/1172283 Vs2010中水晶报表引用 在sap官网中下载支持vs 2010中的水 ...
- Sql Server 主键由字母数字组成并按照数字自动增长
在SQL SERVER 中如果我们想要使主键按照一定规则自动增长我们可以这样做: 这里我们新建一张研究表,里面有研究ID,研究人员姓名和研究医院. 我们使SicentificId 设为主键 并且从1开 ...
- AJAX 表单提交 文件上传
1. AJAX = 异步 JavaScript 和 XML. AJAX 是一种用于创建快速动态网页的技术.通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新.这意味着可以在不重新加载 ...
- Hibernate的三种缓存
一级缓存 hibernate的一级缓存是跟session绑定的,那么一级缓存的生命周期与session的生命周期一致,因此,一级缓存也叫session级缓存或者事务级缓存. 支持一级缓存的方法有: q ...