Como añadido a lo dicho por Instru:
Si decides que la mejor solución en un momento dado es que el programa retorner códigos de error lo más recomendable es usar un enumerado, de tal forma que cada etiqueta del enumerado sea lo más descriptiva posible sobre el error que va a gestionar. De esta forma consigues que el error sea auto explicativo.
Las excepciones suelen tener un par de problemas asociados si se programa sin cuidado:
- Fugas de memoria: cuando se lanza una excepción la traza de la aplicación irá retrocediendo hasta que se encuentre con una gestión de excepciones. Al retroceder en la traza las funciones que estaban a medio ejecutar se cancelan, pudiendo no ejecutarse instrucciones necesarias como delete. Además de ser un poco cuidadosos con la gestión de excepciones es recomendable pasar a usar smartphone pointers y dejarse de punteros crudos tipo POO* mivar.
- Inconsistencias: una excepción, por lo comentado antes sobre la traza, deja funciones a medio terminar. Esto puede provocar que los objetos se queden en un estado inconsistente si no se programan con un poco de cariño. Imagínate que un objeto va almacenando en una variable destinada a resultados finales un resultado parcial y se provoca una excepción...
Ah sí y por supuesto no crear las excepciones con
new que no nos gustan las fugas de memoria jejejeje
Un saludo