错误处理程序是所有严肃的程序的必要部分。但是在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下 composer常见问题及处理

    错误一: Warning: This development build of composer is over 30 days old. It is recommend ed to update i ...

  2. CodeSmith

    完美解决CodeSmith无法获取MySQL表及列Description说明注释的方案   问题描述: CodeSmith是现在比较实用的代码生成器,但是我们发现一个问题: 使用CodeSmith编写 ...

  3. 增加VMWare开机画面时间,来防止快速跳过而无法进入BIOS

    用记事本打开xx.vmx,在里面添加一行: bios.bootDelay = "30000" 意思是开机后,在开机画面里停留30秒.

  4. 防止tab页重复的去请求服务端

    直接看图吧. 左边是企业树,右边是依据企业变化的一个tab页 实现功能:1.我们希望假设选中的企业不变,我们在切换旁边五个tab页的时候,仅仅是第一次进去的时候请求server端.以下来回切换tab页 ...

  5. 算法课上机实验(一个简单的GUI排序算法比较程序)

    (在家里的电脑上Linux Deepin截的图,屏幕大一点的话,deepin用着还挺不错的说) 这个应该是大二的算法课程上机实验时做的一个小程序,也是我的第一个GUI小程序,实现什么的都记不清了,只记 ...

  6. leetcode第十题--Regular Expression Matching

    Problem:Implement regular expression matching with support for '.' and '*'. '.' Matches any single c ...

  7. 分析Java因为语言慢

    Java在早期的(例JDK1.2一旦)这是很慢.也许是因为有很多的优化,以提高装置的版本号,Java这是越来越快,所以这是现在非常的Java和C/C++什么什么慢速争议. 我想我自己的理解.谈论的影响 ...

  8. Oracle中join left,join right,inner join,(+) 等

    Oracle中join left,join right,inner join,(+) 等 博客分类: Oracle   建表create table TEST1create table TEST1(  ...

  9. 自己动手实现Expression翻译器 – Part Ⅱ

    上一节我们了解了Linq查询大体上是如何运转的,并针对SQL表达式进行建模(DbExpression),这一节的重点在于如何将表达式转换为DbExpression. 可以说只要能生成结构清晰的DbEx ...

  10. POCO Controller

    ---恢复内容开始--- POCO Controller 你这么厉害,ASP.NET vNext 知道吗?   写在前面 阅读目录: POCO 是什么? 为什么会有 POJO? POJO 的意义 PO ...