Inizializzazione decodifica dati / Gestione errori costruttore

2

Ho un set di decodificatori di dati caricabili per un tipo specifico di dati e un flusso per leggere i dati contenenti. Ora voglio che il programma selezioni il decodificatore corretto in modo affidabile, quindi voglio usare un algoritmo di prova ed errore. Sembra risonabile creare un decoder e collegarlo allo stream usando un costruttore:

// C++ code
// codecs is an array of structs containing function pointers loaded from a dll
FileIn src("foo.wav");
for(size_t i=0; i<N_CODECS; ++i)
    {
    try
        {
        WaveIn wavein(codecs[i],src);
        //Process data
        return;
        }
    catch(...) //Swallow error. It's likly that another codec works. But if it were another error??
        {
        src.reset();
        }
    }
//no codec found (definitly an error)

Qui, probabilmente non c'è nessun errore vero prima di aver provato tutti i codec nell'elenco. La ragione per cercare di catturare qui è che non è possibile ottenere il codice di ritorno dal ctor. Sarebbe meglio usare gli oggetti zombi in questo caso?

EDIT: ciò che fa il costruttore è il seguente

WaveIn::WaveIn(Vtable& vt, FileIn& src):m_vt(vt)
    {
    m_handle=m_vt.create(src);
    if(m_handle==NULL) //Resources allocated in DLL were released in this case.
         {throw "Bad file";}
    }

Il dtor:

WaveIn::~WaveIn()
    {
    m_vt.destroy(m_handle);
    }
    
posta user877329 30.12.2012 - 19:52
fonte

1 risposta

1

Molti programmatori vedono lanciare eccezioni per controllare il flusso come un odore di codice , perché le eccezioni (in Java, c e C ++) sono come istruzioni goto non locali che sono difficili da comprendere e le probabilità di perdite di memoria sono elevate.

    
risposta data 31.12.2012 - 08:08
fonte

Leggi altre domande sui tag