refs #14369 improve docs for importcpp exceptions (#14391)

* refs #14369 improve docs for importcpp exceptions

* address comments
This commit is contained in:
Timothee Cour 2020-05-18 09:10:30 -07:00 • committed by GitHub
commit 2627e1e945
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -4247,16 +4247,38 @@ It is possible to raise/catch imported C++ exceptions. Types imported using
caught by reference. Example:
.. code-block:: nim
:test: "nim cpp -r $1"
type
std_exception {.importcpp: "std::exception", header: "<exception>".} = object
CStdException {.importcpp: "std::exception", header: "<exception>", inheritable.} = object
## does not inherit from `RootObj`, so we use `inheritable` instead
CRuntimeError {.requiresInit, importcpp: "std::runtime_error", header: "<stdexcept>".} = object of CStdException
## `CRuntimeError` has no default constructor => `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 what(s: std_exception): cstring {.importcpp: "((char *)#.what())".}
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 std_exception()
except std_exception as ex:
echo ex.what()
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()
**Note:** `getCurrentException()` and `getCurrentExceptionMsg()` are not available
for imported exceptions. You need to use `except ImportedException as x:` syntax