Cześć, mam problem z obsługą tak wyrzuconego wyjątku. W jaki sposób mogę się odnieść w funkcji handle() do std::runtime_error?
try {
throw std::runtime_error("jakis blad");
} catch(...) {
UncheckedStausHandler::handle();
}
Cześć, mam problem z obsługą tak wyrzuconego wyjątku. W jaki sposób mogę się odnieść w funkcji handle() do std::runtime_error?
try {
throw std::runtime_error("jakis blad");
} catch(...) {
UncheckedStausHandler::handle();
}
Nie możesz, jeśli chcesz runtime_error
to złap runtime_error
:
try {
throw std::runtime_error("jakis blad");
} catch(std::runtime_error const& e) {
UncheckedStausHandler::handle(e.what());
}
To by było zbyt proste gdybym mógł zrobić tak jak mówisz. Mam takiego maina, którego nie mogę modyfikować i mam do niego dopisać klasę StatusCode i wszystko fajnie działa, oprócz tego że nie wiem jak otrzymać coś takiego "..Handling std::exception jakis blad" (ostatnia linia wyniku).
#include <iostream>
#include "StatusCode.h"
using namespace std;
int main() {
try {
{
StatusCode sc = StatusCode::ALLOK(); // wywolanie bezproblemowe
if ( sc.isok() )
cout << "ok " << endl;
else
cout << "not ok " << sc.info() << endl;
}
{
StatusCode sc = StatusCode::ERROR("Blad");
if ( sc.isok() )
cout << "ok " << endl;
else
cout << "not ok " << sc.info() << endl;
}
{
const StatusCode sc = StatusCode::ALLOK();
StatusCode sc2 = sc; // tu sc2 przejmuje funkcje sprawdzenia czy byl sprawdzony
sc2.isok();
std::cout << "Kod bledu sprawdzony, nie ma wyjatku.\n";
}
{
{
StatusCode sc = StatusCode::ALLOK();
}
std::cout << "Nie sprawdzamy kodu bledu\n";
}
} catch (...) {
UncheckedStausHandler::handle();
}
try {
throw std::runtime_error("jakis blad");
} catch(...) {
UncheckedStausHandler::handle();
}
}
/* wynik
ok
not ok Blad
Kod bledu sprawdzony, nie ma wyjatku.
..Handling UncheckedStatusCode
..Handling std::exception jakis blad
*/
UncheckedStatusHandler
dostarczasz Ty, czy zadający zadanie? Jeśli Ty, to użyj std::current_exception, ale to jest działanie naokoło problemu :/
UncheckedStatusHandler
dostarczam ja, a masz może jeszcze jakiś inny pomysł zamiast tego std::current_exception
, bo nie wolno nam używać c++11
No to, jeśli kontrolujesz obie te klasy, pozostaje Ci chyba tylko jakaś flaga/zmienna globalna, którą być ustawiał i sprawdzał.
void UncheckedStausHandler::handle() {
try {
throw;
} catch ( const std::exception &e ) {
std::cout << "...Handling std::exception " << e.what() << '\n';
}
catch ( const UncheckedStatusCode &e ) {
std::cout << "...Handling UncheckedStatusCode" << e.what() << '\n';
}
catch (...) {
std::cout << "...\n";
}
}