1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
|
/* -----------------------------------------------------------------------------
* exceptions.swg
*
* This SWIG library file provides language independent exception handling
* ----------------------------------------------------------------------------- */
%include <typemaps/swigmacros.swg>
/* macros for error manipulation */
#define %nullref_fmt() "invalid null reference "
#define %varfail_fmt(_type,_name) "in variable '"`_name`"' of type '"`_type`"'"
#ifndef %argfail_fmt
#define %argfail_fmt(_type,_name,_argn) "in method '" `_name` "', argument " `_argn`" of type '" `_type`"'"
#endif
#define %outfail_fmt(_type) "in output value of type '"_type"'"
#ifndef %argnullref_fmt
#define %argnullref_fmt(_type,_name,_argn) %nullref_fmt() %argfail_fmt(_type, _name, _argn)
#endif
#define %varnullref_fmt(_type,_name) %nullref_fmt() %varfail_fmt(_type, _name)
#define %outnullref_fmt(_type) %nullref_fmt() %outfail_fmt(_type)
#define %releasenotownedfail_fmt(_type,_name,_argn) "in method '" `_name` "', cannot release ownership as memory is not owned for argument " `_argn`" of type '" `_type`"'"
/* setting an error */
#define %error(code,msg...) SWIG_Error(code, msg)
#define %type_error(msg...) SWIG_Error(SWIG_TypeError, msg)
%insert("runtime") {
%define_as(SWIG_exception_fail(code, msg), %block(%error(code, msg); SWIG_fail))
%define_as(SWIG_contract_assert(expr, msg), do { if (!(expr)) { %error(SWIG_RuntimeError, msg); SWIG_fail; } } while (0))
}
#ifdef __cplusplus
/*
You can use the SWIG_CATCH_STDEXCEPT macro with the %exception
directive as follows:
%exception {
try {
$action
}
catch (my_except& e) {
...
}
SWIG_CATCH_STDEXCEPT // catch std::exception
catch (...) {
SWIG_exception_fail(SWIG_UnknownError, "Unknown exception");
}
}
*/
%fragment("<stdexcept>");
%define SWIG_CATCH_STDEXCEPT
/* catching std::exception */
catch (std::invalid_argument& e) {
SWIG_exception_fail(SWIG_ValueError, e.what() );
} catch (std::domain_error& e) {
SWIG_exception_fail(SWIG_ValueError, e.what() );
} catch (std::overflow_error& e) {
SWIG_exception_fail(SWIG_OverflowError, e.what() );
} catch (std::out_of_range& e) {
SWIG_exception_fail(SWIG_IndexError, e.what() );
} catch (std::length_error& e) {
SWIG_exception_fail(SWIG_IndexError, e.what() );
} catch (std::runtime_error& e) {
SWIG_exception_fail(SWIG_RuntimeError, e.what() );
} catch (std::exception& e) {
SWIG_exception_fail(SWIG_SystemError, e.what() );
}
%enddef
%define SWIG_CATCH_UNKNOWN
catch (std::exception& e) {
SWIG_exception_fail(SWIG_SystemError, e.what() );
}
catch (...) {
SWIG_exception_fail(SWIG_UnknownError, "unknown exception");
}
%enddef
#endif /* __cplusplus */
|