使用 vl-catch-all-apply (AutoLISP) 捕获错误
AutoLISP 函数导致的错误可能导致程序意外结束,请确保处理可能导致错误的所有已知情况。
- 用 包装每个可能引发错误的函数。vl-catch-all-apply
- 计算 with 返回的值,以查看是否返回了错误对象或值。vl-catch-all-applyvl-catch-all-error-p
- 用于获取与返回的错误对象关联的消息。vl-catch-all-error-message
- 加载、运行和测试代码。
例
下面定义了一个名为 catch-me-if-you-can 的函数。此函数接受两个数字参数,并用于将第一个数字除以第二个数字。该函数确定返回值是否为错误对象。如果返回值是错误对象,则调用 catch-me-if-you-can 从错误对象获取消息。vl-catch-all-applyvl-catch-all-error-pvl-catch-all-applyvl-catch-all-error-message
- 在AutoCAD命令提示符下,输入以下代码:
(defun catch-me-if-you-can (dividend divisor / errobj)
(setq errobj (vl-catch-all-apply '/ (list dividend divisor)))
(if (vl-catch-all-error-p errobj)
(progn
(print (strcat "An error occurred: " (vl-catch-all-error-message errobj)))
(initget "Yes No")
(setq ans (getkword "Do you want to continue? [Y/N]: "))
(if (equal (strcase ans) "YES")
(print "Okay, I'll keep going")
)
)
(print errobj)
)
(princ)
)
注意:您还可以将示例代码添加到现有文件或创建新的 LSP 文件。然后使用 APPLOAD 命令加载 LSP 文件。
- 输入以下代码:
(catch-me-if-you-can 50 2)
该函数返回 25。
- 输入以下代码:
(catch-me-if-you-can 50 0)
该函数发出以下提示:
“发生错误:除以零” 是否要继续?[是/否]:
如果输入 y(或 yes),catch-me-if-you-can 表示它将继续处理。尝试通过更改为 来修改此示例。再次加载并运行除以零的示例。当应用导致错误时,执行会立即停止并调用 *error*,从而导致错误消息。vl-catch-all-applyapply
当您将 ActiveX 与 AutoLISP 一起使用时,这些函数尤为重要。许多 AutoCAD ActiveX 自动化方法都设计为以“异常编程”样式使用。这意味着它们要么在成功时返回有用的值,要么在失败时引发异常(而不是返回错误值)。如果程序使用 ActiveX 方法,则必须准备它以捕获异常,否则程序将停止,使用户处于命令提示符下。vl-catch-*
注意:ActiveX 函数仅在 Windows 上受支持。
|