Index: swig/Lib/typemaps/exception.swg |
=================================================================== |
--- swig/Lib/typemaps/exception.swg (revision 0) |
+++ swig/Lib/typemaps/exception.swg (revision 0) |
@@ -0,0 +1,89 @@ |
+/* ----------------------------------------------------------------------------- |
+ * See the LICENSE file for information on copyright, usage and redistribution |
+ * of SWIG, and the README file for authors - http://www.swig.org/release.html. |
+ * |
+ * 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) |
+ |
+/* 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), if (!(expr)) { %error(SWIG_RuntimeError, msg); SWIG_fail; } else) |
+ |
+} |
+ |
+#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"); |
+ } |
+ } |
+*/ |
+%{ |
+#include <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 */ |