Ho scritto un open source e multipiattaforma Libreria di file C ++ che hanno codici di eccezione e di errore. Le eccezioni possono essere disabilitate quando il programma è in esecuzione. In tal caso, l'utente deve controllare i codici di errore. Ovviamente, quando il lancio delle eccezioni è abilitato, il codice di errore non verrà restituito perché viene generata un'eccezione prima che la funzione richiamata ritorni.
Attualmente, le eccezioni possono ancora essere generate quando disabilitate (bug). Lo aggiusterò presto. Qualcuno mi commenta che è considerato un cattivo progetto avere sia codici di eccezione che di errore. Sono d'accordo con lui e sto per rimuovere i codici di errore e fare in modo che la libreria generi eccezioni derivate personalizzate con ulteriori informazioni di errore.
Ma esito. Mi piace avere questo approccio ibrido per motivi di prestazioni. Questo è quello che sto pensando di fare: mantenere i codici di errore e di eccezione, ma il lancio delle eccezioni è disabilitato attraverso la macro in fase di compilazione invece che in runtime.
Se l'utente definisce quanto segue in un file di configurazione comune
#define ELMAX_EXCEPTION 1
Il codice seguente
int Write(std::wstring str) ELMAX_THROW_OR_NOT;
si espanderebbe in uno dei 2.
// under C++11 compiler
int Write(std::wstring str) noexcept;
// under C++98 compiler
int Write(std::wstring str) throw();
Se ELMAX_EXCEPTION
non è definito o è zero, la macro si espanderebbe a zero.
int Write(std::wstring) ;
Il motivo per cui voglio farlo, è per l'utente della biblioteca che vuole il guadagno di prestazioni di non avere il compilatore che genera il codice di sbobinamento dello stack (per eccezioni) e il compilatore può ottimizzare meglio tali funzioni. La mia libreria di file C ++ utilizza l'API del file C e l'unica cosa che potrebbe generare un'eccezione è new
keyword, che intendo aggiungere nothrow
. Il codice UTF-8 può anche generare eccezioni (è necessario modificarle anche)
char *parr = new (nothrow) char[num];
if(parr==NULL)
// handle it either through error code or throw exception (if enabled)
Si prega gentilmente di consigliare se dovrei avere un approccio di eccezione pura o un approccio ibrido (come detto), per i miei errori di libreria?