首页 理论教育AutoCAD2014中文版错误处理函数

AutoCAD2014中文版错误处理函数

【摘要】:但是,AutoLISP本身内在的错误处理不可能处理所有可能出现的错误,这就需要设计人员根据具体情况进一步进行专门处理了。表14-13 错误处理函数程序不可能总会像程序员所预想的那样运行。AutoLISP程序中作错误的预测检查是非常麻烦的。*error*函数是一个用户可定义的错误处理函数。错误捕获机制允许AutoLISP拦截一个错误,并促使程序执行轨道转到您所选择的另一个函数。首先,错误捕捉的函数名必须称为*error*。程序的控制流程将转移到错误捕获函数。

如果编写的程序是供自己使用的,可以不太考虑程序的错误处理问题。但如果编写的程序是供他人使用的,就应当充分考虑用户可能出现的各种错误操作,把错误引起的损失降低到最小限制,提高程序的容错能力。AutoLISP提供的大多数GET类输入函数具有一定的内在的错误处理能力。但是,AutoLISP本身内在的错误处理不可能处理所有可能出现的错误,这就需要设计人员根据具体情况进一步进行专门处理了。下面的章节对错误处理函数(表14-13)进行介绍。

表14-13 错误处理函数

978-7-111-45924-8-Chapter14-176.jpg

程序不可能总会像程序员所预想的那样运行。显然,当你编写一个程序时,你会对程序中可能的“臭虫”作检查,并对程序要达到的功能进行某些测试。但是不可能检查您可能犯的每一个错误。当发生各种错误时对程序进行控制就是错误检测和错误捕获所要作的全部事情。

在应用程序中需要对3种基本的错误类型进行检查:语法错误、机器错误、逻辑错误

第一种错误是常见的,它即可以是一个语法错误,也可以是一个输入或数据错误。下面的表达式就存在一个语法错误:

978-7-111-45924-8-Chapter14-177.jpg

在第一次运行这个程序时,将能看到这个程序的缺陷,因为将AutoLISP语言的函数getstring拼错了。又如:

978-7-111-45924-8-Chapter14-178.jpg

有时如果忘了拾取一个点而按了Return键的话,也会产生一个错误。在随后的程序中,如果pt1是nil的话,程序将会崩溃。

第二种类型的错误是机器错误。这种类型的错误可能发生在磁盘驱动器和打印机没有准备就绪或文件没有找到的请况下。AutoCAD甚至认为Ctrl+c也是一个错误,且将停止程序的运行。

第三种类型错误是逻辑错误。这种类型的错误不会引起程序的崩溃,但如果计算式是错误的话,可能就得不到正确的结果了。由于许多用户认为计算机算出的东西不会有什么错,因此,这可能也会给您造成损失。

错误的监测有两种基本的方法:“测试”和“捕获”。

既可以预测可能会发生的错误,并编写程序代码来“测试”那些错误,您还可“捕获”错误。可以使用一个错误捕获来识别任何可能发生的错误,该错误捕获依次记录错误原因,并将它发送到可对该错误进行处理的例程中。错误记录通知用户错误发生在什么地方。

AutoLISP程序中作错误的预测检查是非常麻烦的。通常要借助于(if…)语句才能做到。下面的程序实例中就有对错误进行预测检查的代码。该程序可完成图形中所有块引用块名的打印和每个块有多少图元打印。

978-7-111-45924-8-Chapter14-179.jpg

978-7-111-45924-8-Chapter14-180.jpg

在这个程序中变量C是一个选择集名。如果C的值是nil,则意味着没有选择及被生成。由于图形中有可能不存在块引用,变量c的值是nil的情况是很普遍的。

如果c的值是nil的话,(sslengthc)就将产生一个错误:"bad argument type",这种情况下将会使程序崩溃。因此,在程序中对这种致命的错误进行了检测,也就是只有当变量c的值不为nil时,才使用(sslength)函数。

这是预测一个错误的典型实例,在错误发生之前就注意了它会发生的可能性。

另一种很常见的错误是用户所为的错误。这种错误在程序中也应该加以预测,而且更重要的是要为用户提供再作一次的机会。如:

978-7-111-45924-8-Chapter14-181.jpg

仅为了拾取一个点就加了不少的代码。变量lct是一个循环控制器。如果pt1是nil,就会打印出一条错误信息,并继续循环以便允许用户再一次作拾取。如果pt1非nil,循环控制器lct就被设置成nil。这样,(while…)循环就会结束,程序接着往下执行。

1.错误捕捉函数。

978-7-111-45924-8-Chapter14-182.jpg

*error*函数是一个用户可定义的错误处理函数。如果*error*函数非nil,无论什么时候当一个AutoLISP错误条件存在时,就会执行它。AutoCAD会传递一个包含了错误描述信息的字符串给*error*。下面的函数与AutoLISP的标准错误处理程序一样,完成相同的事情,它打印"error:"和一条描述错误的信息。

在*error*函数中,可以包含对command函数的调用,但不能带变元(例如:(command))。这样,它就会中断前面由command函数调用的AutoCAD的命令。

错误捕获机制允许AutoLISP拦截一个错误,并促使程序执行轨道转到您所选择的另一个函数。使用这种方法,当出现一个无法预料的错误时,您可以控制要做什么。(www.chuimin.cn)

错误捕获函数是非常特别的,它有一个非常特别的名字。下面是在程序中怎样使样*error*函数的实例。

978-7-111-45924-8-Chapter14-183.jpg

首先,错误捕捉的函数名必须称为*error*。它还必须有一个传递变量的变元。在我们上面的实例中该变元是errmsg。函数并不关心调用它时所提供的变量是什么。在函数体内,您可以根据您的需要安排各种表达式。

为了做错误捕获的测试,可以将上面的*error*函数放在一个﹒LSP文件中,并加载它。现在完成函数加载后,开始运行您想要运行的任何一个程序。在程序运行过程中按下Ctrl+c键。注意,这时AutoLISP将这一操作作为一个错误拦截。程序的控制流程将转移到错误捕获函数。

您能有一个,也仅能有一个*error*函数。尽管在某一时刻仅能使用一个错误捕获函数,但系统允许加载多个错误函数。假定有3个捕获例程:

978-7-111-45924-8-Chapter14-184.jpg

上面每个函数(它们仅仅是函数的开始部分)都各不相同地处理错误。这些函数再将它们赋给*error*函数之前,没有一个能完成对错误的捕获。幸运的是,只要简单地使用一条(setq)命令就可以将一个函数赋给另一个函数。

978-7-111-45924-8-Chapter14-185.jpg

这个命令将整个函数(trap1)赋给*error*函数。(trap1)函数没有改变,在您的应用程序中,您能一个接一个地安排不同的错误捕获,但请记住,一次仅能使用一个。

在应用程序的设计中,程序员应该牢记一点,那就是永远不要改变用户的设置,包括现有的错误捕获。而应该将用户的设置和现有的错误捕获作为变量保存,而在程序的结尾处根据所保存的变量恢复它们的设置值。

一个完整的错误捕获程序实例如下:

978-7-111-45924-8-Chapter14-186.jpg

978-7-111-45924-8-Chapter14-187.jpg

在上面的程序实例中,现存的错误捕获函数被保存在变量temperr中,然后将*error*分配给您的错误捕获函数(您的错误捕获函数是调用trap1函数)。再接着您可以将任何系统变量(如:对象捕捉方式系统变量osmose)作保存。在本程序中是将系统变量OSNAP的源值赋给变量os,并执行UNDO命令及其选项MARK,如果有一个错误,您的图形就会恢复到它的源设置:

978-7-111-45924-8-Chapter14-188.jpg

在错误捕获函数中开头执行一条中UNDOBACK命令。在程序的结尾处恢复被保存的项目和错误捕捉函数。

2.警告信息函数。

978-7-111-45924-8-Chapter14-189.jpg

调用该函数时,在屏幕上显示出一个警告框,警告框中显示的是一个出错或警告信息,该出错或警告信息是alert函数的变元<string>提供的。一个警告框是带有单个OK按钮的一个对话框。

alert函数弹出的警示框标题总为AutoCADAlert。且居中显示,标题内容是无法改变的警示框的宽度和高度由提供给Alert函数的字符串中的行数和最大行数和最大行长来决定的。警示框的最大行数由所使用的平台和设备决定的。如果信息行超过一定的字符数,则后面的内容将被截断。在alert函数的显示字符串中,可以利用“\n”扩充字符在警示框中显示多行信息。

alert函数的参数必须是字符型常数、变量或表达式。若为空串,则不会弹出警示框。并且其返回值恒为nil。

3.QUIT函数。

978-7-111-45924-8-Chapter14-190.jpg

强制现行应用程序退出。如果调用quit函数,它会返回去错误信息"quitabort",并退出程序返回AutoCAD的Command:提示处。

4.EXIT函数。

978-7-111-45924-8-Chapter14-191.jpg

强行使现行应用程序退出。如果调用exit函数,它会返回错误信息"exitabort",并退出程序回到AutoCAD的Command提示处。