Errori

di il
12 risposte

Errori

Salve a tutti
vorrei sapere come si fa ad intercettare e a gestire gli errori di runtime.
grazie anticipatamente a chiunque mi sappia dare informazioni.

12 Risposte

  • Re: Errori

    In C++ si usa il costrutto

    try ... catch

    http://www.cplusplus.com/doc/tutorial/exceptions
  • Re: Errori

    Quasi .

    Ci sono diversi meccanismi coinvolti:

    1) errori c++, gestiti dal try/catch
    2) errori c, che possono essere intercettati da:
    
    try {
    }
    catch(...) {
    }
    
    (si, proprio 3 puntini).

    3) poi ci sono i structured error handler gestiti da un'estensione del C++ di Microsoft:
    
    __try {
    }
    __except(expression) {
    }
    
    e
    
    __try {
    }
    __finally {
    }
    
    http://msdn.microsoft.com/en-us/library/vstudio/swezty51.aspx

    4) Infine ci sono gli errori generati dalla libreria C (NON C++), o da errori a piu' basso livello, che terminano forzatamente l'applicazione. Questi devono essere gestiti impostando opportunamente il terminate_handler.


    Quello che conviene fare, di solito, e' convertire qualunque eccezione/errore NON C++ in una corrispondente eccezione C++, in modo da avere un unico modello per la gestione delle eccezioni.


    Quindi, il tutto dipende dal tipo di eccezioni che devi intercettare.
  • Re: Errori

    migliorabile ha scritto:


    Quasi .
    Ho premesso in "C++" ed escludendo le "estensioni di MS", tutto il resto è C ...

    Quindi, perché "quasi" ?
  • Re: Errori

    Anche se si compila con il compilatore C++, si usano libreria C che possono generare errori C.

    Anche il seguente codice (banale):
    
    struct C
    {
          int i;
    };
    
    int main(int argc, char** argv)
    {
        C* pc = 0;
        pc->i = 0;
    
        return 0;
    }
    
    e' compilabile in C++ (e' un costrutto C++), ma genera un'eccezione che non e' un'eccezione C++.

    Certo, puo' essere intercettarla con
    
    try {  } catch (...) {  }
    
    ma nella maggior parte dei casi e' un modo troppo grossolano di gestire le eccezioni.
    Va bene per un esercizio, non per un'applicazione piu' complessa (ad esempio una libreria, senza andare troppo lontano).
  • Re: Errori

    Semplicemente io non parlavo di eccezioni generate da codice C, ma da codice C++.
  • Re: Errori

    oregon ha scritto:


    Semplicemente io non parlavo di eccezioni generate da codice C, ma da codice C++.
    L'esempio e' codice C++.

    Lo vuoi piu' C++?
    
    
    struct S
    {
       virtual void m() {  } 
    };
    
    
    int main(int argc, char** argv)
    {
        S* ps = 0;
        ps->m();
    
        return 0;
    }
    
    Questo e' molto piu' C++ del precedente .
  • Re: Errori

    L' errore da gestire è il seguente:
    run-time check failure #2 stack around the variable ..... was corrupted.
    se vorrei levarlo saprei cosa fare visto che si tratta di uno sfondamento di una variabile stringa.
    ma se riesco a gestirlo potrei fare una funzione veramente utile.
  • Re: Errori

    smalldragon ha scritto:


    se volessi levarlo
    E' un controllo che è possibile disabilitare indicandolo nelle opzioni del compilatore.
    Dipende dal compilatore che usi. Con Visual C++ ti può essere utile questa documentazione

    http://msdn.microsoft.com/en-us/library/6kasb93x.asp
  • Re: Errori

    Non lo devo levare ma sfruttare!
    perchè quello che voglio fare è la seguente cosa:
    char pippo[60] // ma nella realtà sarebbe una variabile esterna.
    char carattere;
    int ritorno;ritorno =0;
    {
    for (int i=0;i< 10000;i++)
        {
          carattere=pippo[i];// intercetto l'errore e nella gestione dell'errore dovrei mettere ritorno=i-1;I=10000 e tornare al ciclo
        }
    return ritorno;
    }  
    
  • Re: Errori

    Quello è un controllo che viene fatto una sola volta a runtime da un opportuno codice che viene inserito dal compilatore.

    Se leggi da un'area di memoria da cui non dovresti, non sempre hai modo di accorgertene perché quell'area potrebbe essere memoria regolarmente allocata al processo.

    In caso contrario avresti un'altra eccezione, una "access violation" ... ma con quale compilatore/sistema operi?
  • Re: Errori

    Mi sembra strano che un run time
    effettui una sola volta quel tipo di controllo perchè e uno di quei classici casi che possono dare gravi malfunzionamenti al programma e causare casini al sistema se non viene ben gestito.
    e poi essendo un errore che non è facilmente prevedibile potrebbe non verificarsi.
    ergo per quanto sia sofisticato un analizzatore non potrebbe risolvere il problema prima che esso si verifichi.
    e se anche fosse possibile l'analizzatore andrebbe, o dovrebbe, segnalare in anticipo l'errore quindi che avrebbe rilevato senza eseguire il programma.
    se non facesse quest'ultima cosa l'analizzatore non avrebbe senso non trovi ?
    ma il programma fino a che non incontra l'errore funziona correttamente.
    comunque utilizzo
    visual c++ 2012 windows 7 64 bit
  • Re: Errori

    Questo è un esempio per la cattura dell'eccezione di "access violation" quando questa avviene (ti ricordo che non è sempre così quando si legge/scrive memoria)
    
    #include <stdio.h>
    #include <signal.h>
    
    typedef void (*SignalHandlerPointer)(int);
    
    void SignalHandler(int signal)
    {
        printf("Segnale : %d\n",signal);
        throw "Violazione di accesso";
    }
    
    int main()
    {
        SignalHandlerPointer prevHdl = signal(SIGSEGV , SignalHandler);
        
    	int *p = (int *)10;
    
    	try
    	{
        	int x = *p;
        }
        catch(char *e)
        {
        	printf("Eccezione catturata: %s\n", e);
        }
    
    	return 0;
    }
    
Devi accedere o registrarti per scrivere nel forum
12 risposte