Handling Automation errors in Visual LISP

翻译自原文Kean's blog:http://through-the-interface.typepad.com/through_the_interface/2006/08/handling_automa.html

自从VLisp被推广,开发者便利用它的能力优势来引用COM自动化接口。这种使LISP平台增加许多新的扩展的功能,就像你能通过召唤ObjectARX 程序来实现定义LISP函数。但是,自动操作LISP 允许开发者通过其他应用程序决定于COM的API,就像Miscrosoft Excle。

在LISP中快速标注错误处理...

传统做法是在LISP中定义erro函数,来在执行的过程中抓住错误。通过这个函数,他们可以经常报errno 的值-Autocad 使用它来告诉LISP应用程序哪种错误正在发生,这样可以使开发者明确问题的缘由。

这很好,但是这种全局错误抓取使错误之后不容易恢复程序。  

当通过自动操作接口来处理,事情会变得不同。自动处理客户端一半需要当错误发生时抓住它,而不是定义全局错误处理函数。VLisp通过一个叫vl-catch-all-apply的函数来实现的。vl-catch-all-apply是这样一个函数,不同函数引用时,他的函数名被作为内容提要并以列表的方式发送给vl-catch-all-apply函数。vl-catch-all-apply在函数被引用时,尽全力去抓取错误。apply与vl-catch-all-apply的区别就是函数的返回值,既不是函数引用的返回值,也不是错误对象。

举个不包含自动处理的例子,下面使用我最喜欢的代码要求用户输入两个数字做除法,并反馈结果。我们用(vl-catch-all-error-p)看结果是否正确,如果不正确,我们用(vl-catch-all-error-message)看错误信息。

(defun c:div (/ first second result)

  (setq first (getreal "\nEnter the first number: ")

        second (getreal "\nEnter the second number: ")

        result (vl-catch-all-apply '/ (list first second))

  )

  (if (vl-catch-all-error-p result)

    (princ (strcat "\nCaught an exception: "

                   (vl-catch-all-error-message result)

           )

    )

    (princ (strcat "\nSuccess - the result is "

                   (rtos result)

           )

    )

  )

  (princ)

)

当你运行程序时,得到以下结果

Command: div

 Enter the first number: 50

 Enter the second number: 2

 Success - the result is 25.0000

 Command: div

 Enter the first number: 50

 Enter the second number: 0

 Caught an exception: divide by zero

所以,如何把这个技术应用在自动引用上呢?让我们看另一段代码,这次引用一个函数来检查两个立体的冲突,代码定义了名为CHECKINT的命令,请求选择两个立体。假设两个立体已经选择,它会引用CheckInterference Automation方法,指定任何交集应被创建为独立的实体。

; Helper function to check whether an entity is a solid

(defun is-solid-p (ename)

  (= (cdr (assoc 0 (entget ename))) "3DSOLID")

)

 

; The CHECKINT command

(defun c:checkint (/ first second e1 e2 result)

  (vl-load-com)

  (setq first  (entsel "\nSelect the first solid: ")

        second (entsel "\nSelect the second solid: ")

  )

  (if (and first

          second

          (is-solid-p (setq e1 (car first)))

          (is-solid-p (setq e2 (car second)))

      )

    (progn

      (setq result (vl-catch-all-apply

                      'vla-CheckInterference

                      (list (vlax-ename->vla-object e1)

                            (vlax-ename->vla-object e2)

                            :vlax-true

                      )

                  )

      )

      (if (vl-catch-all-error-p result)

        (princ (strcat "\nCaught an exception: "

                      (vl-catch-all-error-message result)

               )

        )

        (progn

          (princ "\nSuccess!")

          ; Highlight the newly created intersection solid

          (vla-Highlight result :vlax-true)

          (vlax-release-object result)

       )

      )

    )

    (princ "\nMust select two solids.")

  )

  (princ)

)

在Visual Lisp中处理自动化错误的更多相关文章

  1. Visual C++ 中的重大更改

    https://technet.microsoft.com/zh-cn/learning/bb531344.aspx   当你升级到 Visual C++ 编译器的新版本后,可能会在之前编译并正常运行 ...

  2. 【已解决】在 Visual Studio 中设置 JavaScript/TypeScript 的断点 脚本出现自动中断错误

    运行ASP.NET Core 程序出现错误如下: 已启用 Visual Studio 中的 Chrome 脚本调试 在 Visual Studio 中设置 JavaScript/TypeScript ...

  3. Xamarin 中Visual Studio创建项目提示错误

    Xamarin 中Visual Studio创建项目提示错误 错误信息:Object reference not set to an instance of an object 出现这种情况,是由于没 ...

  4. 《Visual C++ 2010入门教程》系列四:VC2010中初学者常见错误、警告和问题

    <Visual C++ 2010入门教程>系列四:VC2010中初学者常见错误.警告和问题   这一章将帮助大家解释一些常见的错误.警告和问题,帮助大家去理解和解决一些常见问题,并了解它的 ...

  5. 如何:使用 Visual Studio 中的一键式发布来部署 Web 应用程序项目

    原文: 如何:使用 Visual Studio 中的一键式发布来部署 Web 应用程序项目 本主题介绍如何在以下产品中使用 一键式发布 发布(部署)Web 应用程序项目: Visual Studio ...

  6. Web 应用程序项目与 Visual Studio 中的网站项目的异同

    要查看英语原文,请勾选“英语”复选框.也可将鼠标指针移到文本上,在弹出窗口中显示英语原文. 翻译 英语 本文档已存档,并且将不进行维护. Web 应用程序项目与 Visual Studio 中的网站项 ...

  7. .net持续集成单元测试篇之单元测试简介以及在visual studio中配置Nunit使用环境

    系列目录 单元测试及测试驱动开发简介 什么是单元测试 单元测试是一段自动化的代码,这段代码调用被测试的工作单元,之后对这个单元的单个最终结果的某些假设进行检验.单元测试几乎都是用单元测试框架编写的.单 ...

  8. "bower.json 中出现语法错误" 的解决方案之一

    当你用 Visual Studio 2015 Update 3 打开从别处下载的开源项目的时候,如果发现 Bower 提示 "bower.json 中出现语法错误". 请检查一下. ...

  9. [No0000AE]在 Visual Studio 中调试 XAML 设计时异常

    在 Visual Studio 中进行 WPF, UWP, Silverlight 开发时,经常会遇到 XAML 设计器由于遭遇异常而无法正常显示设计器视图的情况.很多时候由于最终生成的项目在运行时并 ...

随机推荐

  1. 日常小测:颜色 && Hackerrank Unique_colors

    题目传送门:https://www.hackerrank.com/challenges/unique-colors 感谢hzq大神找来的这道题. 考虑点分治(毕竟是路经统计),对于每一个颜色,它的贡献 ...

  2. oracle数据库表空间追加数据库文件方法

    oracle数据库表空间追加数据库文件方法   针对非大文件方式表空间,允许追加文件进行表空间的扩展,单个文件最大大小是32G  第一种方式:表空间增加数据文件    www.2cto.com   1 ...

  3. HDU--杭电--1195--Open the Lock--深搜--都用双向广搜,弱爆了,看题了没?语文没过关吧?暴力深搜难道我会害羞?

    这个题我看了,都是推荐的神马双向广搜,难道这个深搜你们都木有发现?还是特意留个机会给我装逼? Open the Lock Time Limit: 2000/1000 MS (Java/Others)  ...

  4. XP 安装不了framework 4.0 的解决方法

    第一步: 如果是XP系统: 1.开始——运行——输入cmd——回车——在打开的窗口中输入net stop WuAuServ 2.开始——运行——输入%windir% 3.在打开的窗口中有个文件夹叫So ...

  5. Qt中常见错误整理(不定期更新)

    (1)error: LNK1104: cannot open file 'libboost_thread-vc120-mt-gd-1_57.lib 编译boost库程序时出现问题 解决方法如下: 1. ...

  6. wpf学习笔记

    1.菜单:普通菜单.上下文菜单(ContextMenu) <Menu HorizontalAlignment="Left" Height="20" Ver ...

  7. hihoCoder#1121

    刚开始学习C语言,准备在做hiho的题目的过程中来学习,在此进行记录,如果代码中有错误或者不当的地方还请指正. 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 大家好,我 ...

  8. java基础之 序列化

    一.序列化和反序列化的概念 把对象转换为字节序列的过程称为对象的序列化.       把字节序列恢复为对象的过程称为对象的反序列化. 对象的序列化主要有两种用途: 1) 把对象的字节序列永久地保存到硬 ...

  9. AX2012导Demo数据

    看到这篇文章后http://www.cnblogs.com/duanshuiliu/archive/2012/07/18/2597645.html,为了大家的方便就分享下 关于AX2012的导Demo ...

  10. Octave安装和使用

    1. Installer  Download octave4.0 gnuplot 5.0.4 2. Installation (1) Octave 安装Octave时提示发现系统装有Win8,继续安装 ...