##// END OF EJS Templates
added support for std::exception handling...
florianlink -
r159:aaeb49c23826
parent child
Show More
@@ -47,6 +47,9
47 #include "PythonQtConversion.h"
47 #include "PythonQtConversion.h"
48 #include <iostream>
48 #include <iostream>
49
49
50 #include <exception>
51 #include <stdexcept>
52
50 #define PYTHONQT_MAX_ARGS 32
53 #define PYTHONQT_MAX_ARGS 32
51
54
52
55
@@ -156,13 +159,37 bool PythonQtCallSlot(PythonQtClassInfo* classInfo, QObject* objectToCall, PyObj
156 }
159 }
157
160
158 // invoke the slot via metacall
161 // invoke the slot via metacall
162 bool hadException = false;
163 try {
159 (info->decorator()?info->decorator():objectToCall)->qt_metacall(QMetaObject::InvokeMetaMethod, info->slotIndex(), argList);
164 (info->decorator()?info->decorator():objectToCall)->qt_metacall(QMetaObject::InvokeMetaMethod, info->slotIndex(), argList);
165 } catch (std::bad_alloc & e) {
166 hadException = true;
167 QByteArray what("std::bad_alloc: ");
168 what += e.what();
169 PyErr_SetString(PyExc_MemoryError, what.constData());
170 } catch (std::runtime_error & e) {
171 hadException = true;
172 QByteArray what("std::runtime_error: ");
173 what += e.what();
174 PyErr_SetString(PyExc_RuntimeError, what.constData());
175 } catch (std::logic_error & e) {
176 hadException = true;
177 QByteArray what("std::logic_error: ");
178 what += e.what();
179 PyErr_SetString(PyExc_RuntimeError, what.constData());
180 } catch (std::exception& e) {
181 hadException = true;
182 QByteArray what("std::exception: ");
183 what += e.what();
184 PyErr_SetString(PyExc_StandardError, what.constData());
185 }
160
186
161 if (profilingCB) {
187 if (profilingCB) {
162 profilingCB(PythonQt::Leave, NULL, NULL);
188 profilingCB(PythonQt::Leave, NULL, NULL);
163 }
189 }
164
190
165 // handle the return value (which in most cases still needs to be converted to a Python object)
191 // handle the return value (which in most cases still needs to be converted to a Python object)
192 if (!hadException) {
166 if (argList[0] || returnValueParam.typeId == QMetaType::Void) {
193 if (argList[0] || returnValueParam.typeId == QMetaType::Void) {
167 if (directReturnValuePointer) {
194 if (directReturnValuePointer) {
168 result = NULL;
195 result = NULL;
@@ -177,6 +204,9 bool PythonQtCallSlot(PythonQtClassInfo* classInfo, QObject* objectToCall, PyObj
177 PyErr_SetString(PyExc_ValueError, e.toLatin1().data());
204 PyErr_SetString(PyExc_ValueError, e.toLatin1().data());
178 result = NULL;
205 result = NULL;
179 }
206 }
207 } else {
208 result = NULL;
209 }
180 }
210 }
181 recursiveEntry--;
211 recursiveEntry--;
182
212
General Comments 0
You need to be logged in to leave comments. Login now