C++ POO Lab Lucrarea 5

De la WikiLabs
Jump to navigationJump to search

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