Diferență între revizuiri ale paginii „C++ POO Lab Lucrarea 5”
(Nu s-au afișat 18 versiuni intermediare efectuate de același utilizator) | |||
Linia 5: | Linia 5: | ||
La compilarea codului pot apărea diferite erori făcute de programator, erori datorate introducerii greșite sau alte lucruri neprevăzute. | La compilarea codului pot apărea diferite erori făcute de programator, erori datorate introducerii greșite sau alte lucruri neprevăzute. | ||
− | Când apare o eroare, execuția se va opri și va genera un mesaj de eroare. Acest lucru se numește aruncarea unei | + | Când apare o eroare, execuția se va opri și va genera un mesaj de eroare. Acest lucru se numește aruncarea unei excepții. |
= Try, throw and catch = | = Try, throw and catch = | ||
− | Gestionarea excepțiilor | + | Gestionarea excepțiilor se face folosind cele trei cuvinte cheie: '''try''', '''throw''' și '''catch''' . |
+ | |||
+ | Pentru a se prinde excepțiile, codul respectiv se include într-un bloc '''try''', unde putem testa dacă exista erori în timp ce executam codul. | ||
+ | |||
+ | Dacă nu exista erori în secțiunea respectiva, execuția programului continuă normal. | ||
+ | |||
+ | O excepție este aruncată utilizând cuvântului '''throw''' din interiorul blocului '''try'''. | ||
+ | |||
+ | Cuvântul cheie '''throw''' ne permite sa definim excepții personalizate. | ||
+ | |||
+ | Manipularea de excepții se face prin cuvântul '''catch'''. Acesta ne permite sa definim un bloc de cod care sa fie executat în cazul în care apare o eroare în blocul '''try''' . | ||
+ | |||
+ | ===Exemplu=== | ||
+ | |||
+ | <syntaxhighlight lang="C++"> | ||
+ | #include <iostream> | ||
+ | using namespace std; | ||
+ | |||
+ | int main(){ | ||
+ | try { | ||
+ | int nota_mate = 4; | ||
+ | if (nota_mate >= 5) { | ||
+ | cout << "Promovat"; | ||
+ | } else { | ||
+ | //aruncam eroarea | ||
+ | throw 101; | ||
+ | } | ||
+ | } | ||
+ | catch (int err) { | ||
+ | //tratam eroarea | ||
+ | cout << "Picat\n"; | ||
+ | cout << "Err: " << err; | ||
+ | } | ||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | Output: | ||
+ | |||
+ | <syntaxhighlight lang="C++"> | ||
+ | Picat | ||
+ | Err: 101 | ||
+ | |||
+ | </syntaxhighlight> | ||
+ | |||
+ | = '''<stdexcept>''' = | ||
+ | |||
+ | Aceasta biblioteca conține un set de excepții standard pe care programul le poate folosi pentru a raporta erori. | ||
+ | |||
+ | ===Exemplu=== | ||
+ | |||
+ | În acest exemplu, funcția medieBac() este apelată în interiorul blocului try din main. Funcția medieBac() așteaptă sa primească ca argument 3 numere întregi și aruncă o excepție invalid_argument dacă oricare dintre acestea este negativ. | ||
+ | |||
+ | Clasa std::invalid_argument este definită în biblioteca <stdexcept>. Această clasă definește tipurile de obiecte care trebuie aruncate ca excepții și raportează erori care apar deoarece o valoare a argumentului nu a fost acceptată. | ||
+ | |||
+ | Blocul '''catch''' din funcția main prinde excepția invalid_argument și o tratează. | ||
+ | |||
+ | Constructor implicit '''what()''' returnează un șir definit de implementare. | ||
+ | |||
+ | <syntaxhighlight lang="C++"> | ||
+ | #include <iostream> | ||
+ | #include <stdexcept> | ||
+ | using namespace std; | ||
+ | |||
+ | double medieBac(int romana, int mate, int info) | ||
+ | { | ||
+ | if (mate < 0 || romana < 0 || info < 0) | ||
+ | throw invalid_argument("Notele de la bacalaureat trebuie sa fie numere pozitive"); | ||
+ | return (mate + info + romana) / 2.; | ||
+ | } | ||
+ | int main() | ||
+ | { | ||
+ | try | ||
+ | { | ||
+ | cout << medieBac(-1, 8, 10); | ||
+ | } | ||
+ | catch (invalid_argument& err) | ||
+ | { | ||
+ | cout << err.what() << endl; | ||
+ | } | ||
+ | return 0; | ||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | Output: | ||
+ | |||
+ | <syntaxhighlight lang="C++"> | ||
+ | Notele de la bacalaureat trebuie sa fie numere pozitive | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | =Aruncarea de erori multiple= | ||
+ | |||
+ | === Exemplu === | ||
+ | |||
+ | În exemplul dat aruncam mai multe erori în interiorul blocului '''try'''. | ||
+ | |||
+ | Prima eroare este de tip int, iar a doua de tip std::string. | ||
+ | |||
+ | În momentul în care este aruncată prima excepție, controlul programului este transferat la o clauza catch. Ceea ce înseamnă ca restul codului din blocul try nu va fi executat. | ||
+ | |||
+ | <syntaxhighlight lang="C++"> | ||
+ | #include <iostream> | ||
+ | #include <string> | ||
+ | |||
+ | using namespace std; | ||
+ | int main() | ||
+ | { | ||
+ | try | ||
+ | { | ||
+ | bool check1 = true; | ||
+ | bool check2 = true; | ||
+ | |||
+ | if (check1) | ||
+ | { | ||
+ | cout << "Eroare 1" << '\n'; | ||
+ | throw 404; | ||
+ | } | ||
+ | if(check2) | ||
+ | { | ||
+ | cout << "Eroare 2" << '\n'; | ||
+ | throw string{ "393" }; | ||
+ | } | ||
+ | } | ||
+ | catch (int e) | ||
+ | { | ||
+ | cout << "Eroare: " << e << '\n'; | ||
+ | } | ||
+ | |||
+ | catch (string& e) | ||
+ | { | ||
+ | cout << "Eroare: " << e << '\n'; | ||
+ | } | ||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | Output: | ||
+ | |||
+ | <syntaxhighlight lang="C++"> | ||
+ | Eroare 1 | ||
+ | Eroare: 404 | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | = Standard error stream ('''cerr''') = | ||
+ | |||
+ | '''cerr''' este fluxul de erori standard care este utilizat pentru a afișa erorile. | ||
+ | |||
+ | Este folosit atunci când vrem să afișăm imediat mesajul de eroare și nu sa stocam mesajul pentru a fi afișat mai târziu. | ||
+ | |||
+ | === Exemplu === | ||
+ | |||
+ | <syntaxhighlight lang="C++"> | ||
+ | #include <iostream> | ||
+ | #include <string> | ||
+ | |||
+ | using namespace std; | ||
+ | int main() | ||
+ | { | ||
+ | cout << "cout1\n"; | ||
+ | cerr << "cerr\n"; | ||
+ | cout << "cout2\n"; | ||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | <syntaxhighlight lang="C++"> | ||
+ | cerr | ||
+ | cout1 | ||
+ | cout2 | ||
+ | </syntaxhighlight> |
Versiunea curentă din 2 aprilie 2022 21:05
Introducere
Această lucrare are ca scop familiarizarea cu excepțiile.
La compilarea codului pot apărea diferite erori făcute de programator, erori datorate introducerii greșite sau alte lucruri neprevăzute.
Când apare o eroare, execuția se va opri și va genera un mesaj de eroare. Acest lucru se numește aruncarea unei excepții.
Try, throw and catch
Gestionarea excepțiilor se face folosind cele trei cuvinte cheie: try, throw și catch .
Pentru a se prinde excepțiile, codul respectiv se include într-un bloc try, unde putem testa dacă exista erori în timp ce executam codul.
Dacă nu exista erori în secțiunea respectiva, execuția programului continuă normal.
O excepție este aruncată utilizând cuvântului throw din interiorul blocului try.
Cuvântul cheie throw ne permite sa definim excepții personalizate.
Manipularea de excepții se face prin cuvântul catch. Acesta ne permite sa definim un bloc de cod care sa fie executat în cazul în care apare o eroare în blocul try .
Exemplu
#include <iostream>
using namespace std;
int main(){
try {
int nota_mate = 4;
if (nota_mate >= 5) {
cout << "Promovat";
} else {
//aruncam eroarea
throw 101;
}
}
catch (int err) {
//tratam eroarea
cout << "Picat\n";
cout << "Err: " << err;
}
}
Output:
Picat
Err: 101
<stdexcept>
Aceasta biblioteca conține un set de excepții standard pe care programul le poate folosi pentru a raporta erori.
Exemplu
În acest exemplu, funcția medieBac() este apelată în interiorul blocului try din main. Funcția medieBac() așteaptă sa primească ca argument 3 numere întregi și aruncă o excepție invalid_argument dacă oricare dintre acestea este negativ.
Clasa std::invalid_argument este definită în biblioteca <stdexcept>. Această clasă definește tipurile de obiecte care trebuie aruncate ca excepții și raportează erori care apar deoarece o valoare a argumentului nu a fost acceptată.
Blocul catch din funcția main prinde excepția invalid_argument și o tratează.
Constructor implicit what() returnează un șir definit de implementare.
#include <iostream>
#include <stdexcept>
using namespace std;
double medieBac(int romana, int mate, int info)
{
if (mate < 0 || romana < 0 || info < 0)
throw invalid_argument("Notele de la bacalaureat trebuie sa fie numere pozitive");
return (mate + info + romana) / 2.;
}
int main()
{
try
{
cout << medieBac(-1, 8, 10);
}
catch (invalid_argument& err)
{
cout << err.what() << endl;
}
return 0;
}
Output:
Notele de la bacalaureat trebuie sa fie numere pozitive
Aruncarea de erori multiple
Exemplu
În exemplul dat aruncam mai multe erori în interiorul blocului try.
Prima eroare este de tip int, iar a doua de tip std::string.
În momentul în care este aruncată prima excepție, controlul programului este transferat la o clauza catch. Ceea ce înseamnă ca restul codului din blocul try nu va fi executat.
#include <iostream>
#include <string>
using namespace std;
int main()
{
try
{
bool check1 = true;
bool check2 = true;
if (check1)
{
cout << "Eroare 1" << '\n';
throw 404;
}
if(check2)
{
cout << "Eroare 2" << '\n';
throw string{ "393" };
}
}
catch (int e)
{
cout << "Eroare: " << e << '\n';
}
catch (string& e)
{
cout << "Eroare: " << e << '\n';
}
}
Output:
Eroare 1
Eroare: 404
Standard error stream (cerr)
cerr este fluxul de erori standard care este utilizat pentru a afișa erorile.
Este folosit atunci când vrem să afișăm imediat mesajul de eroare și nu sa stocam mesajul pentru a fi afișat mai târziu.
Exemplu
#include <iostream>
#include <string>
using namespace std;
int main()
{
cout << "cout1\n";
cerr << "cerr\n";
cout << "cout2\n";
}
cerr
cout1
cout2