PageRenderTime 20ms CodeModel.GetById 13ms app.highlight 2ms RepoModel.GetById 1ms app.codeStats 1ms

/trunk/Lib/typemaps/exception.swg

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