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 通常默认会确保检测模块和命令的返回码并且会快速失败 – 专注于一个错误除非你另作打算. ...
随机推荐
- C# ---- 串口数据YSI实例
原文:C# ---- 串口数据YSI实例 C#----串口数据接收发送中,发送接收数据已经可以模拟了. 本次YSI实例过程中 主要是:类型转换问题 .计算校验码 一.不同设备不同的规则,本次实例代码如 ...
- 小言HTTP Authentication
什么是Authentication? 首先解释两个长的非常像.easy混淆的单词,Authentication(鉴定.认证)和Authorization(授权). Authentication就是要证 ...
- shell 批量压缩指定文件夹及子文件夹内图片
shell 批量压缩指定文件夹及子文件夹内图片 用户上传的图片,一般都没有经过压缩,造成空间浪费.因此须要编写一个程序,查找文件夹及子文件夹的图片文件(jpg,gif,png),将大于某值的图片进行压 ...
- PHP Socket编程 之使用fsockopen()函数
Socket可以理解为两台计算机相互通信的通道. 用法:使用fsockopen()函数 具体用法详见上篇文章.函数的参数为URL.端口号.一个存放错误编号的变量.一个存放错误信息字符串的变量和超时等待 ...
- Mysql之IN 和 Exists 用法
1.基本用法 IN:后面的子查询 是返回结果集的,换句话说执行次序和Exists()不一样.子查询先产生结果集,然后主查询再去结果集里去找符合要求的字段列表去.符合要求的输出,反之则不输出. Exis ...
- Java集合之LinkedHashSet源码分析
1.简介 我们知道Set不允许包含相同的元素,如果试图把两个相同元素加入同一个集合中,add方法返回false.根据源码实现中的注释我们可以知道LinkedHashSet是具有可预知迭代顺序的Set接 ...
- Bootstrap Paginator分页插件
Bootstrap Paginator分页插件使用示例 最近做的asp.netMVC项目中需要对数据列表进行分类,这个本来就是基于bootstrap开发的后台,因此也就想着bootstrap是否有分页 ...
- SQL SERVER统计服务器所有的数据库(数据库文件)、表(表行数)、字段(各字段)等详细信息
原文:SQL SERVER统计服务器所有的数据库(数据库文件).表(表行数).字段(各字段)等详细信息 USE STAT GO SET NOCOUNT ON IF EXISTS(SELECT 1 FR ...
- 一步一步实现基于Task的Promise库(四)无参数的WorkItem
接着上一篇我直接给出代码,现在支持了new Task(), then(), all(), any() 这些不传参的调用方式. (function(){ var isFunction = functio ...
- document对象属性documentMode与CompatMode
DOCTYPE DOCTYPE全称Document Type Declaration(文档类型声明,缩写DTD) DTD的声明影响浏览器对于CSS代码及Javascript脚本的解析. 渲染模式 渲染 ...