两种出错处理方式:一种是对出错函数进行重定义,一种是对错误进行捕捉处理。

  1. ;;===================================================================================================
  2. ;;===================================================================================================
  3. ;;===========================================两种出错处理方式========================================
  4. ;;===================================================================================================
  5. ;;===================================================================================================
  6. ;;=============================================01.出错函数===========================================
  7. (defun c:tt()
  8. ;;备份系统出错函数
  9. (setq *error*_bak *error*)
  10. ;;将自定义出错函数赋值给系统出错函数
  11. (setq *error* *error*_non)
  12. ;;备份捕捉
  13. (setq osmode_bak (getvar "osmode"))
  14. ;;----------------------------------------
  15. )
  16. (getpoint)
  17. (command "line" pause pause "")
  18. ;;----------------------------------------
  19. ;;正常执行也要还原出错函数
  20. (setq *error* *error*_bak)
  21. ;;正常执行也要还原修改的变量
  22. (setvar "osmode" osmode_bak)
  23. )
  24. ;;定义自己的出错函数
  25. (defun *error*_non (msg)
  26. ;;对于CAD内置command命令执行的使用(command)取消执行,然后执行后面语句
  27. (command)
  28. ;;将系统出错函数进行还原
  29. (setq *error* *error*_bak)
  30. ;;出错后还原修改的变量
  31. (setvar "osmode" osmode_bak)
  32. )
  33. ;;=============================================02.错误捕捉===========================================
  34. ;;功 能:命令是否存在
  35. ;;参 数:命令字符串
  36. ;;返回值:存在为T,否则为nil
  37. (defun isCommandExist(commandstr / candcommandstr isexist myvalue)
  38. (setq cAndCommandStr (strcat "c:" commandStr))
  39. (if (equal (type (eval (read cAndCommandStr))) 'subr)
  40. ;;说明是用lisp的defun定义的命令
  41. (progn
  42. (setq isExist T)
  43. ;(print "命令存在!")
  44. )
  45. ;;不是lisp中defun定义的命令
  46. (progn
  47. (if
  48. ;;if判断的条件
  49. (not
  50. ;;捕捉错误,错误存在为T,不存在为FALSE
  51. (vl-catch-all-error-p
  52. ;;将语句执行结果返回给myvalue,语句执行出错myvalue值为#<%catch-all-apply-error%>,不出错的话就是语句执行后的结果
  53. (setq myvalue
  54. ;;执行语句,并且用vl-catch-all-apply捕捉错误,注意后面的格式,第一个为函数注意前面用单引号,后面为函数参数表
  55. (vl-catch-all-apply '(lambda (x) (progn (command x) (setq lastCommand (getvar "LASTPROMPT")) (if (not (wcmatchlastCommand "*未知命令*")) (command "ESC")))) (list commandStr))
  56. )
  57. )
  58. )
  59. ;;if条件后的第一条语句
  60. ;;如果执行出错就执行下面这句
  61. (progn
  62. (setq isExist nil)
  63. ;(print "命令不存在!")
  64. )
  65. ;;if条件后的第二条语句
  66. ;;如果执行出错,就捕捉错误,执行下面这句
  67. (progn
  68. (setq isExist T)
  69. ;(print "命令存在!")
  70. )
  71. );;end if
  72. ;;取消命令操作
  73. (if isExist
  74. (progn
  75. (command)
  76. )
  77. );;end if
  78. );;end progn
  79. );;end if
  80. ;;输出值,命令存在时是T,否则是nil
  81. isExist
  82. )

【Visual Lisp】两种出错处理方式的更多相关文章

  1. Web APi之认证(Authentication)两种实现方式【二】(十三)

    前言 上一节我们详细讲解了认证及其基本信息,这一节我们通过两种不同方式来实现认证,并且分析如何合理的利用这两种方式,文中涉及到的基础知识,请参看上一篇文中,就不再叙述废话. 序言 对于所谓的认证说到底 ...

  2. Android中BroadcastReceiver的两种注册方式(静态和动态)详解

    今天我们一起来探讨下安卓中BroadcastReceiver组件以及详细分析下它的两种注册方式. BroadcastReceiver也就是"广播接收者"的意思,顾名思义,它就是用来 ...

  3. Android中Fragment与Activity之间的交互(两种实现方式)

    (未给Fragment的布局设置BackGound) 之前关于Android中Fragment的概念以及创建方式,我专门写了一篇博文<Android中Fragment的两种创建方式>,就如 ...

  4. JavaScript 函数的两种声明方式

    1.函数声明的方式 JavaScript声明函数有两种选择:函数声明法,表达式定义法. 函数声明法 function sum (num1 ,num2){ return num1+num2 } 表达式定 ...

  5. Redis两种持久化方式(RDB&AOF)

    爬虫和转载请注明原文地址;博客园蜗牛:http://www.cnblogs.com/tdws/p/5754706.html Redis所需内存 超过可用内存怎么办 Redis修改数据多线程并发—Red ...

  6. struts2+spring的两种整合方式

    也许有些人会因为学习了struts1,会以为struts2.struts1与spring的整合也是一样的,其实这两者相差甚远.下面就来讲解一下struts2与spring的整合两种方案.(部分转载,里 ...

  7. easyui datagride 两种查询方式

    easyui datagride 两种查询方式function doReseach() { //$('#tt').datagrid('load', { // FixedCompany: $('.c_s ...

  8. 两种include方式及filter中的dispatcher解析

    两种include方式 我自己写了一个original.jsp,另外有一个includedPage.jsp,我想在original.jsp中把includedPage.jsp引进来有两种方式: 1.& ...

  9. Java多线程13:读写锁和两种同步方式的对比

    读写锁ReentrantReadWriteLock概述 大型网站中很重要的一块内容就是数据的读写,ReentrantLock虽然具有完全互斥排他的效果(即同一时间只有一个线程正在执行lock后面的任务 ...

随机推荐

  1. Angularjs学习笔记(一)

    大部分传统的模板系统,对模板的渲染是个线性单向的过程:模板或变量与模板混合在一起产生结果的标记集合.任何对模型的改变都需要通过模板的重新计算.但AngularJS有所不同,任何用户引发的视图的改变,都 ...

  2. fiddler 配置

    fiddler 是一个抓包工具: 配置模拟器:(逍遥游安卓模拟器) 逍遥参考:http://www.xyaz.cn/thread-163-1-1.html 1.启动模拟器后,点击设置,点击进入Wi-F ...

  3. 阐述程序员如何实现IT职业定位

    [动力IT职业生涯规划课]阐述程序员如何实现IT职业定位 2016年9月16日下午17:00,南通动力IT教育创始人阙海忠先生,亲自向动力IT学员传授其十八年IT从业经验. 一个程序员的完美人生定位 ...

  4. 010editor 破解 扩展

    1. 注册机注册,注册机搜一下吧 (破解算法各版本通用) 2. 绕过网络验证,每次关闭010editor时都会网络验证,并将验证结果写道本地,所以: HKEY_CURRENT_USER\Softwar ...

  5. Xcode8不能使用快捷键“command+/”注释代码的解决方法

    sudo /usr/libexec/xpccachectl 打开终端,输入该命令(如果电脑有密码的话,会有提示让输入密码) 接下来重启电脑. command + option + / 还可以多行注释

  6. redis对比其余数据库

    Redis属于常见的NoSQL数据库或者说非关系数据库:Redis不使用表,她的数据库也不会预定义或者强制去要求用户对Redis存储的不同数据进行关联. 常见数据库对比: 和高性能键值缓存服务器mem ...

  7. JS-小球碰撞反弹

    类似于屏保的一种动画,当小球碰到边框时,发生反弹,并且变化颜色. <!DOCTYPE html><html lang="en"><head>   ...

  8. c语言选择排序

    简单选择排序是经常用到的一种排序算法. 原理: 1.简单选择排序一句话概括:每次选择无序数列中最小的将其放在有序数列的最后. 2.在简单选择排序中,我们用初始化的数字int a[6]={2,5,6,3 ...

  9. [刘阳Java]_斗胆介绍一下Eclipse快捷键大全[超详细]_第6讲

    斗胆让我在这里介绍一下Eclipse快捷键有哪些 ctrl+shirt+r 打开资源 这组快捷键可以让你开打Eclipse工作区中任何一个文件,你只需要输入你想查找的文件名字即可,而且绝对支持模糊检索 ...

  10. [翻译]:怎样从C/C++代码中对C#进行回调

    声明:网络上类似的中文博客大有存在,本人知识水平有限,业余爱好,也是为了备份收藏How to make a callback to C# from C/C++ code 本着共享知识的初衷,翻译一份给 ...