Sto implementando callback in C++ che verranno chiamati dal normale codice C. La mia funzione main() è già C++, ma il codice C sarà responsabile della creazione di thread che alla fine chiameranno i miei callback.try {} catch (...) {} in callback C - cattiva idea?
In questo momento i miei callback sembrano
int handle_foo(void *userdata) {
try {
MyCPPClass *obj = static_cast<MyCPPClass *>(userdata);
obj->doStuff();
return 0; // no error
} catch(...) {
LogError("doStuff failed");
return -1; // error
}
}
Questo funziona bene, ma sembra strano per me. Inoltre, perdo alcune funzionalità utili come la possibilità di scoprire che cosa è stato generato (senza aggiungere un'enorme quantità di ulteriori dichiarazioni catch
a ciascuna delle mie richiamate).
È try {} catch(...) {}
qui ragionevole, o c'è un modo migliore per scrivere i miei callback C?
Se l'evento che 'doStuff()' genera un'eccezione, se c'è qualcosa che il tuo programma C chiamante può effettivamente fare per continuare? Se non può funzionare intorno all'eccezione, non c'è alcun vantaggio ad esso con l'eccezione IMO. Avere la buona conoscenza che il tuo 'handle_foo' non ha intenzione di gettare renderà il tuo codice chiamante molto più facile da leggere. – TZHX
È necessario impedire a qualsiasi eccezione di lasciare una funzione chiamata da una funzione C e provare a catturare è il modo per farlo. Se hai bisogno della tua eccezione per "attraversare" un livello C, puoi usare un'eccezione globale ptr (non dire che questo sarebbe un buon stile). Essenzialmente questo ti dà un meccanismo di errno più potente, ma devi comunque ccheckmanually per un errore quando il tuo c-code ritorna. – MikeMB
'Inoltre, perdo alcune funzioni utili come la capacità di scoprire cosa è stato lanciato. Catch 'std :: exception' e log' exception :: what'. Non lanciare nulla che non sia derivato da 'std :: exception'. – sbabbi