Sto scrivendo un software reattivo, che riceve più volte di input, elabora ed emette relativa uscita. Il ciclo principale sembra qualcosa di simile:Alternativa a C++ eccezione
initialize();
while (true) {
Message msg,out;
recieve(msg);
process(msg,out);
//no global state is saved between loop iterations!
send(out);
}
voglio che tutto ciò che l'errore si è verificato durante la fase di proccess, whetehr è errore di memoria, errore logico, l'affermazione non valida, ecc, il programma ripulire tutto ciò che ha fatto, e continuare a correre. Suppongo che sia un input non valido e semplicemente lo ignoro.
L'eccezione di C++ è eccezionalmente buona per quella situazione, potrei circondare process
con la clausola try/catch
e generare un'eccezione ogni volta che qualcosa va in wrog. L'unica cosa di cui ho bisogno per assicurarmi di pulire tutte le mie risorse prima di lanciare un'eccezione. Questo potrebbe essere verificato da RAII, o scrivendo un allocatore di risorse globali (ad esempio, se il tuo distruttore potrebbe lanciare un'eccezione), e usarlo esclusivamente per tutte le risorse.
Socket s = GlobalResourceHandler.manageSocket(new Socket());
...
try {
process(msg,out);
catch (...) {
GlobalResourceHandler.cleanUp();
}
Tuttavia, utilizzando eccezione è vietato nel nostro standard di codifica (anche in Google's C++ standard BTW), di conseguenza tutto il codice è stato compilato con le eccezioni al largo, e credo che nessuno sta andando a cambiare il modo di lavorare tutto solo per il mio problema di progettazione.
Inoltre, questo è il codice per la piattaforma embedded, in modo che la funzione ++ meno C in più si usa, più velocemente il codice diventa, e il più portabile che è.
C'è un progetto alternativo che posso prendere in considerazione?
aggiornamento: Apprezzo la risposta di tutti su standard di codice idiota. L'unica cosa che posso dire è che nelle grandi organizzazioni devi avere regole severe e talvolta illogiche, per assicurarti che non ci sia un idiota e rendere il tuo buon codice non mantenibile. Lo standard riguarda più le persone che i dettagli tecnici. Sì, l'uomo cattivo può rendere ogni codice un disastro, ma è molto peggio se gli dai strumenti extra per il compito.
Sto ancora cercando un tecnico risposta .
La prego di fornire riferimento alla norma ++ C del Google che vieta le eccezioni? –
Il modo corretto di farlo con le eccezioni non è tramite l'allocatore globale, ma usando gli oggetti RAII (http://en.wikipedia.org/wiki/Resource_Acquisition_Is_Initialization). –
@Pavel: triste ma vero, http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml#Exceptions –