From 22ff22072956f8b843037c75c5b16b7ff5d6a2a3 Mon Sep 17 00:00:00 2001 From: einhornimmond Date: Fri, 14 May 2021 15:18:38 +0200 Subject: [PATCH] add try catch blocks to prevent login-server from crashing --- .../JSONInterface/JsonCreateTransaction.cpp | 57 ++++++++++++++----- .../src/cpp/tasks/CPUShedulerThread.cpp | 12 +++- 2 files changed, 54 insertions(+), 15 deletions(-) diff --git a/login_server/src/cpp/JSONInterface/JsonCreateTransaction.cpp b/login_server/src/cpp/JSONInterface/JsonCreateTransaction.cpp index 381ded7e5..6bda11153 100644 --- a/login_server/src/cpp/JSONInterface/JsonCreateTransaction.cpp +++ b/login_server/src/cpp/JSONInterface/JsonCreateTransaction.cpp @@ -85,6 +85,7 @@ Poco::JSON::Object* JsonCreateTransaction::handle(Poco::Dynamic::Var params) Poco::JSON::Object* JsonCreateTransaction::transfer(Poco::Dynamic::Var params) { + static const char* function_name = "JsonCreateTransaction::transfer"; auto target_pubkey = getTargetPubkey(params); if (!target_pubkey) { return customStateError("not found", "receiver not found"); @@ -126,20 +127,33 @@ Poco::JSON::Object* JsonCreateTransaction::transfer(Poco::Dynamic::Var params) result = stateError("sender and receiver are the same"); } if (!result) { - auto transaction = model::gradido::Transaction::createTransfer(sender_user, target_pubkey, mTargetGroup, amount, mMemo, mBlockchainType); + try { + auto transaction = model::gradido::Transaction::createTransfer(sender_user, target_pubkey, mTargetGroup, amount, mMemo, mBlockchainType); - if (mAutoSign) { - Poco::JSON::Array errors; - transaction->sign(user); - if (transaction->errorCount() > 0) { - errors.add(transaction->getErrorsArray()); - } + if (mAutoSign) { + Poco::JSON::Array errors; + transaction->sign(user); + if (transaction->errorCount() > 0) { + errors.add(transaction->getErrorsArray()); + } - if (errors.size() > 0) { - return stateError("error by signing transaction", errors); + if (errors.size() > 0) { + return stateError("error by signing transaction", errors); + } } } - + catch (Poco::Exception& ex) { + NotificationList errors; + errors.addError(new ParamError(function_name, "poco exception: ", ex.displayText())); + errors.sendErrorsAsEmail(); + return stateError("exception"); + } + catch (std::exception& ex) { + NotificationList errors; + errors.addError(new ParamError(function_name, "std::exception: ", ex.what())); + errors.sendErrorsAsEmail(); + return stateError("exception"); + } result = stateSuccess(); } mm->releaseMemory(target_pubkey); @@ -147,6 +161,7 @@ Poco::JSON::Object* JsonCreateTransaction::transfer(Poco::Dynamic::Var params) } Poco::JSON::Object* JsonCreateTransaction::creation(Poco::Dynamic::Var params) { + static const char* function_name = "JsonCreateTransaction::creation"; auto target_pubkey = getTargetPubkey(params); if (!target_pubkey) { return customStateError("not found", "receiver not found"); @@ -205,11 +220,25 @@ Poco::JSON::Object* JsonCreateTransaction::creation(Poco::Dynamic::Var params) } if(!result) { - auto transaction = model::gradido::Transaction::createCreation(mReceiverUser, amount, target_date, mMemo, mBlockchainType); - if (mAutoSign) { - if (!transaction->sign(mSession->getNewUser())) { - return stateError("error by signing transaction", transaction); + try { + auto transaction = model::gradido::Transaction::createCreation(mReceiverUser, amount, target_date, mMemo, mBlockchainType); + if (mAutoSign) { + if (!transaction->sign(mSession->getNewUser())) { + return stateError("error by signing transaction", transaction); + } } + } + catch (Poco::Exception& ex) { + NotificationList errors; + errors.addError(new ParamError(function_name, "poco exception: ", ex.displayText())); + errors.sendErrorsAsEmail(); + return stateError("exception"); + } + catch (std::exception& ex) { + NotificationList errors; + errors.addError(new ParamError(function_name, "std::exception: ", ex.what())); + errors.sendErrorsAsEmail(); + return stateError("exception"); } result = stateSuccess(); diff --git a/login_server/src/cpp/tasks/CPUShedulerThread.cpp b/login_server/src/cpp/tasks/CPUShedulerThread.cpp index 9529b536f..710adc413 100644 --- a/login_server/src/cpp/tasks/CPUShedulerThread.cpp +++ b/login_server/src/cpp/tasks/CPUShedulerThread.cpp @@ -32,6 +32,8 @@ namespace UniLib { int CPUShedulerThread::ThreadFunction() { + Poco::Logger& errorLog = Poco::Logger::get("errorLog"); + static const char* function_name = "CPUShedulerThread::ThreadFunction"; while(!mWaitingTask.isNull()) { @@ -53,7 +55,15 @@ namespace UniLib { #endif } catch (Poco::NullPointerException& ex) { - printf("[CPUShedulerThread::ThreadFunction] Null Pointer Exception for Task type: %s\n", mWaitingTask->getResourceType()); + //printf("[CPUShedulerThread::ThreadFunction] Null Pointer Exception for Task type: %s\n", mWaitingTask->getResourceType()); + errorLog.error("[%s] Null Pointer Exception for Task type %s: %s", function_name, mWaitingTask->getResourceType(), ex.displayText()); + } + catch (Poco::Exception& ex) { + errorLog.error("[%s] Exception for Task type %s: %s", function_name, mWaitingTask->getResourceType(), ex.displayText()); + } + catch (std::exception& ex) { + std::string exception_message = ex.what(); + errorLog.error("[%s] std::exception for task type %s: %s", function_name, mWaitingTask->getResourceType(), exception_message); } mWaitingTask = mParent->getNextUndoneTask(this);