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