Co powoduje, że lepszym rozwiązaniem jest stosowanie bloków try
i catch
zamiast if'ów i zwracania konkretnego kodu błędu?
Exceptiony:
#include <iostream>
#include <exception>
int main(int argc, char *argv[])
{
try
{
if (argc != 2)
throw std::out_of_range("Too few arguments.");
std::cout << argv[1] << '\n';
}
catch (const std::out_of_range& e)
{
std::cerr << "Exception: " << e.what() << '\n';
return -1;
}
return 0;
}
If'y:
#include <iostream>
int main(int argc, char *argv[])
{
if (argc != 2)
{
std:cerr << "Too few arguments." << '\n';
return -1;
}
std::cout << argv[1] << '\n';
return 0;
}
Z tego co do tej pory czytałem to:
- Wyjątki nie mogą być ignorowane. Po rzuceniu wyjątku nawet jeżeli nie został złapany, a następnie obsłużony, proces i tak zostanie zabity.
- RAII działa, czyli istnieje gwarancja, że wszystkie zasoby zaalokowane na stosie zostaną automatycznie zwolnione po wystąpieniu wyjątku.
Z tego co mi się wydaję to ten drugi punkt może powodować przewagę systemu wyjątków nad if'ami z C. Czy jest coś jeszcze co powinienem wziąć pod uwagę?