使用 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 上可用。 
  
 
 
    
 |