Base: Exception handling:

* Harmonize FreeCAD with Python exception types
* Implement AbortException::getPyExceptionType() to avoid handling it in client code
* Remove catch block for plain C strings
This commit is contained in:
wmayer
2022-01-19 18:00:04 +01:00
parent 2a3991d799
commit 659a55ffb9
7 changed files with 75 additions and 99 deletions

View File

@@ -178,8 +178,8 @@ using namespace std;
ParameterManager *App::Application::_pcSysParamMngr;
ParameterManager *App::Application::_pcUserParamMngr;
Base::ConsoleObserverStd *Application::_pConsoleObserverStd =0;
Base::ConsoleObserverFile *Application::_pConsoleObserverFile =0;
Base::ConsoleObserverStd *Application::_pConsoleObserverStd = nullptr;
Base::ConsoleObserverFile *Application::_pConsoleObserverFile = nullptr;
AppExport std::map<std::string,std::string> Application::mConfig;
BaseExport extern PyObject* Base::BaseExceptionFreeCADError;
@@ -262,7 +262,7 @@ Application::Application(std::map<std::string,std::string> &mConfig)
PyModuleDef_HEAD_INIT,
"__FreeCADConsole__", Console_doc, -1,
ConsoleSingleton::Methods,
NULL, NULL, NULL, NULL
nullptr, nullptr, nullptr, nullptr
};
PyObject* pConsoleModule = PyModule_Create(&ConsoleModuleDef);
@@ -289,11 +289,11 @@ Application::Application(std::map<std::string,std::string> &mConfig)
PyDict_SetItemString(modules, "__FreeCADBase__", pBaseModule);
}
Base::BaseExceptionFreeCADError = PyErr_NewException("Base.FreeCADError", PyExc_RuntimeError, NULL);
Base::BaseExceptionFreeCADError = PyErr_NewException("Base.FreeCADError", PyExc_RuntimeError, nullptr);
Py_INCREF(Base::BaseExceptionFreeCADError);
PyModule_AddObject(pBaseModule, "FreeCADError", Base::BaseExceptionFreeCADError);
Base::BaseExceptionFreeCADAbort = PyErr_NewException("Base.FreeCADAbort", PyExc_BaseException, NULL);
Base::BaseExceptionFreeCADAbort = PyErr_NewException("Base.FreeCADAbort", PyExc_BaseException, nullptr);
Py_INCREF(Base::BaseExceptionFreeCADAbort);
PyModule_AddObject(pBaseModule, "FreeCADAbort", Base::BaseExceptionFreeCADAbort);
@@ -343,7 +343,7 @@ Application::Application(std::map<std::string,std::string> &mConfig)
PyModuleDef_HEAD_INIT,
"Units", "The Unit API", -1,
Base::UnitsApi::Methods,
NULL, NULL, NULL, NULL
nullptr, nullptr, nullptr, nullptr
};
PyObject* pUnitsModule = PyModule_Create(&UnitsModuleDef);
Base::Interpreter().addType(&Base::QuantityPy ::Type,pUnitsModule,"Quantity");
@@ -1790,7 +1790,7 @@ void my_se_translator_filter(unsigned int code, EXCEPTION_POINTERS* pExp)
throw Base::AccessViolation();
case EXCEPTION_FLT_DIVIDE_BY_ZERO:
case EXCEPTION_INT_DIVIDE_BY_ZERO:
//throw Base::DivisionByZeroError("Division by zero!");
//throw Base::ZeroDivisionError("Division by zero!");
Base::Console().Error("SEH exception (%u): Division by zero\n", code);
return;
}
@@ -1837,7 +1837,7 @@ void Application::init(int argc, char ** argv)
}
}
void Application::initTypes(void)
void Application::initTypes()
{
// Base types
Base::Type ::init();
@@ -2019,8 +2019,8 @@ void Application::initTypes(void)
new ExceptionProducer<Base::RuntimeError>;
new ExceptionProducer<Base::BadGraphError>;
new ExceptionProducer<Base::NotImplementedError>;
new ExceptionProducer<Base::DivisionByZeroError>;
new ExceptionProducer<Base::ReferencesError>;
new ExceptionProducer<Base::ZeroDivisionError>;
new ExceptionProducer<Base::ReferenceError>;
new ExceptionProducer<Base::ExpressionError>;
new ExceptionProducer<Base::ParserError>;
new ExceptionProducer<Base::UnicodeError>;