Sto cercando di convincere il mio team a consentire l'utilizzo delle eccezioni in C ++ invece di restituire un bool isSuccessful
o un enum con il codice di errore. Tuttavia, non posso contrastare questa sua critica.
Considera questa libreria:
class OpenFileException() : public std::runtime_error {
}
void B();
void C();
/** Does blah and blah. */
void B() {
// The developer of B() either forgot to handle C()'s exception or
// chooses not to handle it and let it go up the stack.
C();
};
/** Does blah blah.
*
* @raise OpenFileException When we failed to open the file. */
void C() {
throw new OpenFileException();
};
Considera uno sviluppatore che chiama la
B()
funzione. Controlla la sua documentazione e vede che non restituisce eccezioni, quindi non cerca di catturare nulla. Questo codice potrebbe causare l'arresto anomalo del programma in produzione.Considera uno sviluppatore che chiama la
C()
funzione. Non controlla la documentazione, quindi non rileva alcuna eccezione. La chiamata non è sicura e potrebbe causare l'arresto anomalo del programma in produzione.
Ma se controlliamo la presenza di errori in questo modo:
void old_C(myenum &return_code);
Uno sviluppatore che utilizza quella funzione verrà avvisato dal compilatore se non fornisce tale argomento, e direbbe "Ah, questo restituisce un codice di errore che devo verificare."
Come posso utilizzare le eccezioni in modo sicuro, in modo che ci sia una sorta di contratto?
Either
/ Result
monade per restituire l'errore in modo componibile sicuro per il tipo