Aby odpowiedzieć na twoje pytanie, nie jest to absurdalny pomysł i można faktycznie używać std::exception
do regularnej obsługi błędów; z pewnymi zastrzeżeniami.
Korzystanie std::exception
jako wynik funkcji
Załóżmy, że funkcja może wyjść w kilku stanach błędu:
std::exception f(int i)
{
if (i > 10)
return std::out_of_range("Index is out of range");
if (can_do_f())
return unexpected_operation("Can't do f in the current state");
return do_the_job();
}
Jak można sobie z tym poradzić z std::exception
lub opcjonalnego jednego? Gdy funkcja zwróci, zostanie utworzona kopia wyjątku, zachowując tylko część std::exception
i odrzucając szczegóły rzeczywistego błędu; pozostawiając ci jedyną informację, że "tak, coś poszło nie tak ...". Zachowanie będzie takie samo, jak zwracanie wartości boolowskiej lub opcjonalnego oczekiwanego typu wyniku, jeśli taki istnieje.
Korzystanie std::exception_ptr
zapisać specyfikę
Innym rozwiązaniem byłoby zastosowanie tego samego podejścia niż w std::promise, to zwróci std::exception_ptr
. Tam będziesz mógł zwrócić albo nic albo wyjątek, zachowując rzeczywiste szczegóły błędu. Przywrócenie faktycznego typu błędu może nadal być trudne.
Wracając błąd lub wynik w tym samym obiekcie
Wreszcie inna opcja byłoby użyć Expected<T>
proposal i its implementation. Tam będziesz mógł zwrócić wartość lub błąd w jednym obiekcie i obsłużyć błąd, który chcesz (testując błąd lub przy zwykłej obsłudze wyjątku), z pewnymi szczegółami dla przypadku funkcji zwracającej brak wartości (więcej na Stack Overflow lub na this blog).
Jak wybrać
Moja osobista opinia w tej sprawie jest to, że jeśli masz zamiar używać wyjątków, a następnie wykorzystywać je tak, zostały one zaprojektowane, ostatecznie z kilku dodatkowych narzędzi jak Expected<T>
aby ułatwić . W przeciwnym razie, jeśli nie możesz korzystać ze standardowej obsługi wyjątków, przejdź do rozwiązania, które się sprawdziło, podobnie jak klasyczny system kodów błędów.
@vsoftco: Zobacz edycję. Mówię o obsłudze błędów wyrzucania wyjątków. – einpoklum
Interesujące ... Ostatnio usłyszałem, że Google wydaje się używać takiego systemu, nie wiem, czy to prawda, czy nie. Co jeśli twoje funkcje muszą coś zwrócić? Użyjesz pary/krotki? – vsoftco
@vsoftco: Nie zagłębiamy się w szczegóły ... chodzi tylko o to, czego użyć do zgłaszania błędów. Ale - albo funkcja będzie miała parametr wejścia/wyjścia (referencja lub wskaźnik), albo może zwróci pewną klasę przypadków (jestem pewien, że C++ ma już coś takiego, to lepsze niż związki C). – einpoklum