Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1

    [C++] Trovare eccezioni

    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!
    Non ho firme, ma la ferma speranza che compaia una firma automatica ogni qualvolta ci sia bisogno di una firma, fermo restando che la speranza di una firma è l' ultima a morire

  2. #2
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,378
    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.
    codice:
    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.
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  3. #3
    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, e per questo pare che comunque non si guadagni molto in prestazioni con i throw() vuoti, visto che comunque il compilatore alla fine fa:
    codice:
    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.
    Amaro C++, il gusto pieno dell'undefined behavior.

  4. #4
    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?
    Non ho firme, ma la ferma speranza che compaia una firma automatica ogni qualvolta ci sia bisogno di una firma, fermo restando che la speranza di una firma è l' ultima a morire

  5. #5
    Certo, per esempio potresti farla derivata da std::exception, in modo che possa essere gestita anche un generico:

    codice:
    catch(std::exception& )
    Un esempio:
    codice:
    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;
    };
    An infinite number of monkeys typing into GNU emacs would never make a good program.Linus Torvalds

  6. #6
    Grazie mille, ora ci provo subito!
    Di nuovo grazie!
    Non ho firme, ma la ferma speranza che compaia una firma automatica ogni qualvolta ci sia bisogno di una firma, fermo restando che la speranza di una firma è l' ultima a morire

  7. #7
    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?
    Non ho firme, ma la ferma speranza che compaia una firma automatica ogni qualvolta ci sia bisogno di una firma, fermo restando che la speranza di una firma è l' ultima a morire

  8. #8
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,378
    Se MyException è derivato da std::exception (o classe a sua volta derivata da std::exception) metti std::exception altrimenti MyException.
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  9. #9
    Codice PHP:
    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!
    Grazie!
    Non ho firme, ma la ferma speranza che compaia una firma automatica ogni qualvolta ci sia bisogno di una firma, fermo restando che la speranza di una firma è l' ultima a morire

  10. #10
    codice:
    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.

    codice:
    catch (exception& exc)
    An infinite number of monkeys typing into GNU emacs would never make a good program.Linus Torvalds

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2019 vBulletin Solutions, Inc. All rights reserved.