导入的异常

导入的 C++ 异常也可以抛出和捕获。使用 importcpp 导入的类型可以抛出和捕获。异常通过值抛出,通过引用捕获。 例子如下:

  1. type
  2. CStdException {.importcpp: "std::exception", header: "<exception>", inheritable.} = object
  3. ## 异常不继承自 `RootObj`, 所以我们使用 `inheritable` 关键字
  4. CRuntimeError {.requiresInit, importcpp: "std::runtime_error", header: "<stdexcept>".} = object of CStdException
  5. ## `CRuntimeError` 没有默认构造器 => `requiresInit`
  6. proc what(s: CStdException): cstring {.importcpp: "((char *)#.what())".}
  7. proc initRuntimeError(a: cstring): CRuntimeError {.importcpp: "std::runtime_error(@)", constructor.}
  8. proc initStdException(): CStdException {.importcpp: "std::exception()", constructor.}
  9. proc fn() =
  10. let a = initRuntimeError("foo")
  11. doAssert $a.what == "foo"
  12. var b: cstring
  13. try: raise initRuntimeError("foo2")
  14. except CStdException as e:
  15. doAssert e is CStdException
  16. b = e.what()
  17. doAssert $b == "foo2"
  18. try: raise initStdException()
  19. except CStdException: discard
  20. try: raise initRuntimeError("foo3")
  21. except CRuntimeError as e:
  22. b = e.what()
  23. except CStdException:
  24. doAssert false
  25. doAssert $b == "foo3"
  26. fn()

注意 getCurrentException() 和 getCurrentExceptionMsg() 不能用于从 C++ 导入的异常。 开发者需要使用 except ImportedException as x: 语句并且依靠对象 x 本身的功能获取异常的具体信息。