【Visual Lisp】两种出错处理方式

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

  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. )
上一篇:【渝粤教育】国家开放大学2018年春季 7404-21T数学建模 参考试题


下一篇:20款响应式的 HTML5 网页模板【免费下载】