MCPcopy Create free account
hub / github.com/RedisGears/RedisGears / getPyError

Function getPyError

plugins/python/redisgears_python.c:5191–5246  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

5189}
5190
5191char* getPyError() {
5192 if(!PyErr_Occurred()){
5193 return NULL;
5194 }
5195 PyObject *pType, *pValue, *pTraceback;
5196 PyErr_Fetch(&pType, &pValue, &pTraceback);
5197 PyErr_NormalizeException(&pType, &pValue, &pTraceback);
5198 PyObject *pMsg = NULL;
5199 if (pType == GearsFlatError) {
5200 // flat error, return the message only!
5201 pMsg = PyObject_Str(pValue);
5202 }
5203 if (!pMsg) {
5204 PyObject *pModuleName = PyUnicode_FromString("traceback");
5205 PyObject *pModule = PyImport_Import(pModuleName);
5206 if(pythonConfig.attemptTraceback && pTraceback != NULL && pModule != NULL){
5207 PyObject *pFunc = PyObject_GetAttrString(pModule, "format_exception");
5208 if(pFunc != NULL){
5209 if(PyCallable_Check(pFunc)){
5210 PyObject *pCall = PyObject_CallFunctionObjArgs(pFunc, pType, pValue, pTraceback, NULL);
5211 if(pCall){
5212 pMsg = PyObject_Str(pCall);
5213 GearsPyDecRef(pCall);
5214 }
5215 }
5216 GearsPyDecRef(pFunc);
5217 }
5218 GearsPyDecRef(pModule);
5219 }
5220 GearsPyDecRef(pModuleName);
5221 }
5222 if(!pMsg){
5223 PyObject *pStrFormat = PyUnicode_FromString("Error type: %s, Value: %s");
5224 PyObject* pStrType = PyObject_Str(pType);
5225 PyObject* pStrValue = PyObject_Str(pValue);
5226 PyObject *pArgs = PyTuple_New(2);
5227 PyTuple_SetItem(pArgs, 0, pStrType);
5228 PyTuple_SetItem(pArgs, 1, pStrValue);
5229 pMsg = PyUnicode_Format(pStrFormat, pArgs);
5230 GearsPyDecRef(pArgs);
5231 GearsPyDecRef(pStrFormat);
5232 }
5233 char *msg = (char*)PyUnicode_AsUTF8AndSize(pMsg, NULL);
5234 char* err = RG_STRDUP(msg);
5235 GearsPyDecRef(pMsg);
5236 if(pType){
5237 GearsPyDecRef(pType);
5238 }
5239 if(pValue){
5240 GearsPyDecRef(pValue);
5241 }
5242 if(pTraceback){
5243 GearsPyDecRef(pTraceback);
5244 }
5245 return err;
5246}
5247
5248void fetchPyError(ExecutionCtx* rctx) {

Callers 14

continueFutureOnDoneFunction · 0.85
FinishAsyncDAGRunFunction · 0.85
FinishAsyncModelRunFunction · 0.85
FinishAsyncScriptRunFunction · 0.85
TimeEvent_CallbackFunction · 0.85
fetchPyErrorFunction · 0.85

Calls 1

GearsPyDecRefFunction · 0.85

Tested by

no test coverage detected