Repository navigation
K) Exceptions
kalinosia edited this page Mar 13, 2021
·
1 revision
To komunikat, wartość jakiegoś typu. Do rzucenia służy throw
int main(){
throw 0;
}
zaleca się używanie typów zdefiniowanych w < stdexcept >
-
std:: logic_errorOgólny błąd - naruszono założenie, niezmiennik itp. -
std:: runtime_errorOgólny błąd - błąd czasu wykonywania (możliwy do wykrycia tylko w czasie wykonywania) -
std:: invalid_argumentPrzekazano nieprawidłowy argument -
std:: domain_errorBłąd dziedziny operacji (matematycznie) np. dzielenie przez zero -
std::lenght_errorPrzekroczenie maksymalnego dozwolonego rozmiaru czegoś -
std:: out_of_rangeArgument poza dopuszczalnym zakresem -
std:: range_errorPrzekroczenie zakresu w obliczeniach, np. wynik obliczeń jest poza zakresem docel. typu -
std:: overflow_errorPrzepełnienie liczby -
std:: underflow_errorNiedopełnienie liczby
#include <stdexcept>
int main()
{
throw std::runtime_error("Mój pierwszy wyjątek");
}
Wyjątek trzeba złapać try żeby wiedzieć co zostało wyrzucone i mieć szanse obsłużyć wyjątek. Kod umieszczamy w bloku try, po którym musi się znajdować co najmniej jedna klauzula catch.
#include <iostream>
#include <stdexcept>
void func(){
//HERE CHANGE |
// \ /
throw std::runtime_error("Something wrong"); //1.
//throw std::logic_error("Something wrong" ); //2.
//throw "cos innego"; //3.
//throw 5; //4.
}
void test(){
try{
std::cout << "First\n";
func();
std::cout<<"Second\n";
func();
}
catch(std::runtime_error & e){
std::cout<<"Runtime error: "<<e.what()<<" (but it's ok)" <<'\n';
}catch( std::exception & e){
std::cout<<"Different stand. excep."<<e.what()<<std::endl;
throw; //Rzuć ponownie złapany wątek
}catch(int){
std::cout<<"I told not to throw int!\n";
throw std::logic_error("Unexpected int");
}catch(...){
std::cout<<"Not expect, not know exception\n";
throw std::logic_error("Catched not know exception");
}
}
int main(){
try{
test();
}catch(std::runtime_error & e){
std::cout<<"blad wykoaniania programu: "<<e.what()<<std::endl;
}catch(std::logic_error & e){
std::cout<<"Blad logiczny programu: "<<e.what()<<std::endl;
}
}
First
Runtime error: Something wrong (but it's ok)
First
Different stand. excep.Something wrong
Blad logiczny programu: Something wrong
First
Not expect, not know exception
Blad logiczny programu: Catch not know exception
First
I told not to throw int!
Blad logiczny programu: Unexpected int
Taką gwarancję znacznie łatwiej "spełnić": służy do tego słowo kluczowe noexcept, wprowadzone w C++11. Możemy go użyć do jawnego określenia, że funkcja nie wyrzuca wyjątków:
void funkcja() noexcept{