PDA

Visualizza la versione completa : [C++] Trovare eccezioni


frankitt
03-11-2010, 21:16
Salve a tutti, vi scrivo per chiedervi se c'è qualche modo per sapere in anticipo se una certa porzione di codice può sollevare un' eccezione. Oppure se esiste qualche sito, o qualche guida, che mostri tutte le possibili eccezioni, con magari degli esempi che mostrino come possano verificarsi. (ovviamente mi sono messo a cercare, ma non ho trovato nulla!)
Grazie in anticipo!

shodan
03-11-2010, 21:52
Non esiste nulla del genere.
Le eccezioni possono essere user defined, nel senso che ognuno può crearsi una propria gerarchia senza ereditare da quelle standard e gli specificatori di eccezione a fine funzione sono deprecati perché inutili ai fini pratici.

In linea teorica puoi sapere che una funzione non genera eccezioni se termina con il costrutto throw()
es.


void funzione() throw();

nel qual caso il compilatore si fida e non genera il codice per gestire la cosa. Se però nella funzione qualcosa genera un'eccezione, il comportamento è indefinito (presumo; non ho lo standard sotto mano. In genere viene chiamata abort(), ma credo dipendenda dall'implementazione).

In genere se una funzione genera un'eccezione, la cosa è documentata.Se è una funzione dello standard, la catturi con un generico catch (const std::exception& e) altrimenti occorre la documentazione.

MItaly
03-11-2010, 22:03
Originariamente inviato da shodan
nel qual caso il compilatore si fida e non genera il codice per gestire la cosa. Se però nella funzione qualcosa genera un'eccezione, il comportamento è indefinito (presumo; non ho lo standard sotto mano. In genere viene chiamata abort(), ma credo dipendenda dall'implementazione).
Se non erro viene garantito che verrà chiamato std::terminate (http://www.cplusplus.com/reference/std/exception/terminate/), e per questo pare che comunque non si guadagni molto in prestazioni con i throw() vuoti, visto che comunque il compilatore alla fine fa:


try
{
// tutto il codice della funzione
}
catch(...)
{
std::terminate();
}

Il concetto di fondo degli specificatori di eccezioni credo che sia una cosa tipo la const-correctness, non tanto per aiutare il compilatore ma per dare garanzie al programmatore.


In genere se una funzione genera un'eccezione, la cosa è documentata.Se è una funzione dello standard, la catturi con un generico catch (const std::exception& e) altrimenti occorre la documentazione.
In linea di massima per fortuna la maggior parte delle librerie fa ereditare la propria gerarchia di eccezioni da std::exception per evitare casini.

frankitt
03-11-2010, 22:53
Ragazzi vi ringrazio davvero per le vostre risposte.
Tutto questo perchè sto cercando di fare una classe che venga istanziata per gestire delle situazioni che possono verificarsi nel mio progetto.
Io vorrei fare una classe che gestisce le eccezioni, che data un numero intero N, mi stampi una certa stringa.

vorrei fare qualcosa del tipo

if (file non esiste) {
throw MyException(25);
}

é possibile farlo?

EDX
03-11-2010, 22:58
Certo, per esempio potresti farla derivata da std::exception, in modo che possa essere gestita anche un generico:


catch(std::exception& )

Un esempio:

class MyException : public std::exception
{
public:
MyException(std::string s) { error = s; }
~MyException() throw() {}

virtual const char * what() const throw()
{
return error.c_str();
}

private:
std::string error;
};

frankitt
03-11-2010, 23:25
Grazie mille, ora ci provo subito!
Di nuovo grazie!

frankitt
04-11-2010, 18:36
Rieccomi perchè ho degli errori!

In generale quando faccio throw MyException che devo mettere nel catch?

Per intenderci:

try {
if(file non trovato) {
throw MyException();
}
}

catch(??) <-- exception oppure MyException?

shodan
04-11-2010, 18:41
Se MyException è derivato da std::exception (o classe a sua volta derivata da std::exception) metti std::exception altrimenti MyException.

frankitt
04-11-2010, 18:57
class ExceptionsHandler : public exception {
public:
ExceptionsHandler(const int);
virtual const char * what() const throw() { return error.str().c_str(); }
private:
ostringstream error; };


ExceptionsHandler::
ExceptionsHandler(const int error_type)
{
if (error_type > num_error_msg) {
error << "[***] Errore non conosciuto" << endl;
} else {
error << error_messages[error_type] << endl;
}
}


// In un altra parte del programma...
catch (exception exc) {
cerr << exc.what();
}


Teoricamente è giusta questa classe?? Perchè quando faccio la stampa dell' errore mi esce fuori un banalissimo std::exception....! E non ho fatto tutto sto bordello solo per questo! :cry:
Grazie!

EDX
04-11-2010, 19:17
catch (exception exc)

Così prende un oggetto std::exception, devi prendere un riferimento, in modo che per effetto polimorfico tu possa accedere alla tua eccezzione personalizzata.


catch (exception& exc)

Loading