##// END OF EJS Templates
added support for std::exception handling...
florianlink -
r159:aaeb49c23826
parent child
Show More
@@ -47,6 +47,9
47 47 #include "PythonQtConversion.h"
48 48 #include <iostream>
49 49
50 #include <exception>
51 #include <stdexcept>
52
50 53 #define PYTHONQT_MAX_ARGS 32
51 54
52 55
@@ -156,25 +159,52 bool PythonQtCallSlot(PythonQtClassInfo* classInfo, QObject* objectToCall, PyObj
156 159 }
157 160
158 161 // invoke the slot via metacall
159 (info->decorator()?info->decorator():objectToCall)->qt_metacall(QMetaObject::InvokeMetaMethod, info->slotIndex(), argList);
160
162 bool hadException = false;
163 try {
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 }
186
161 187 if (profilingCB) {
162 188 profilingCB(PythonQt::Leave, NULL, NULL);
163 189 }
164 190
165 191 // handle the return value (which in most cases still needs to be converted to a Python object)
166 if (argList[0] || returnValueParam.typeId == QMetaType::Void) {
167 if (directReturnValuePointer) {
168 result = NULL;
169 } else {
170 // the resulting object maybe present already, because we created it above at 1)...
171 if (!result) {
172 result = PythonQtConv::ConvertQtValueToPython(returnValueParam, argList[0]);
192 if (!hadException) {
193 if (argList[0] || returnValueParam.typeId == QMetaType::Void) {
194 if (directReturnValuePointer) {
195 result = NULL;
196 } else {
197 // the resulting object maybe present already, because we created it above at 1)...
198 if (!result) {
199 result = PythonQtConv::ConvertQtValueToPython(returnValueParam, argList[0]);
200 }
173 201 }
202 } else {
203 QString e = QString("Called ") + info->fullSignature() + ", return type '" + returnValueParam.name + "' is ignored because it is unknown to PythonQt. Probably you should register it using qRegisterMetaType() or add a default constructor decorator to the class.";
204 PyErr_SetString(PyExc_ValueError, e.toLatin1().data());
205 result = NULL;
174 206 }
175 207 } else {
176 QString e = QString("Called ") + info->fullSignature() + ", return type '" + returnValueParam.name + "' is ignored because it is unknown to PythonQt. Probably you should register it using qRegisterMetaType() or add a default constructor decorator to the class.";
177 PyErr_SetString(PyExc_ValueError, e.toLatin1().data());
178 208 result = NULL;
179 209 }
180 210 }
General Comments 0
You need to be logged in to leave comments. Login now