导入的异常
导入的 C++ 异常也可以抛出和捕获。使用 importcpp 导入的类型可以抛出和捕获。异常通过值抛出,通过引用捕获。 例子如下:
type
CStdException {.importcpp: "std::exception", header: "<exception>", inheritable.} = object
## 异常不继承自 `RootObj`, 所以我们使用 `inheritable` 关键字
CRuntimeError {.requiresInit, importcpp: "std::runtime_error", header: "<stdexcept>".} = object of CStdException
## `CRuntimeError` 没有默认构造器 => `requiresInit`
proc what(s: CStdException): cstring {.importcpp: "((char *)#.what())".}
proc initRuntimeError(a: cstring): CRuntimeError {.importcpp: "std::runtime_error(@)", constructor.}
proc initStdException(): CStdException {.importcpp: "std::exception()", constructor.}
proc fn() =
let a = initRuntimeError("foo")
doAssert $a.what == "foo"
var b: cstring
try: raise initRuntimeError("foo2")
except CStdException as e:
doAssert e is CStdException
b = e.what()
doAssert $b == "foo2"
try: raise initStdException()
except CStdException: discard
try: raise initRuntimeError("foo3")
except CRuntimeError as e:
b = e.what()
except CStdException:
doAssert false
doAssert $b == "foo3"
fn()
注意 getCurrentException() 和 getCurrentExceptionMsg() 不能用于从 C++ 导入的异常。 开发者需要使用 except ImportedException as x: 语句并且依靠对象 x 本身的功能获取异常的具体信息。
当前内容版权归 vectorworkshopbaoerjie 或其关联方所有,如需对内容或内容相关联开源项目进行关注与资助,请访问 vectorworkshopbaoerjie .