Una es usar excepciones de C++: intente atrapar bloques. Pero liberar la memoria dinámica será un problema cuando se produce una excepción .
@see RAII.
Las excepciones deben ser su método preferido para hacer frente a situaciones excepcionales de tiempo de ejecución, como quedarse sin memoria. Tenga en cuenta que algo como std :: map :: find no arroja (y no debería) porque no es necesariamente un error o un caso particularmente excepcional buscar una clave que no existe: la función puede informar al cliente si o no, la clave existe. No es como una violación de una precondición o condición posterior como requerir que exista un archivo para que un programa funcione correctamente y encontrar que el archivo no está allí.
La belleza del manejo de excepciones, si lo hace correctamente (de nuevo, @see RAII), es que evita la necesidad de ensuciar el código de manejo de errores en su sistema.
Consideremos un caso en el que la función A llama a la función B que llama a C, luego a D y así sucesivamente hasta llegar a 'Z'. Z es la única función que puede arrojar, y A es el único interesado en recuperarse de un error (A es el punto de entrada para una operación de alto nivel, por ejemplo, como cargar una imagen). Si se apega a RAII que será útil para algo más que el manejo de excepciones, entonces solo necesita poner una línea de código en Z para lanzar una excepción y un pequeño bloque try/catch en A para capturar la excepción y, por ejemplo, mostrar un mensaje de error para el usuario.
Desafortunadamente, mucha gente no se adhiere a RAII tan estrictamente como debería hacerlo en la práctica, por lo que muchos códigos del mundo real tienen más bloqueos try/catch que los necesarios para lidiar con la limpieza manual de recursos (que no debería debe ser manual). Sin embargo, este es el ideal que debe esforzarse por lograr en su código, y es más práctico si se trata de un proyecto de tamaño medio. Del mismo modo, en escenarios del mundo real, las personas a menudo ignoran los códigos de error devueltos por las funciones. Si va a hacer un esfuerzo adicional a favor de la robustez, también podría comenzar con RAII porque eso ayudará a su aplicación, independientemente de si utiliza el manejo de excepciones o el manejo de códigos de error.
Hay una advertencia: no debe arrojar excepciones a través de los límites del módulo.Si lo hace, debe considerar un híbrido entre los códigos de error (como en devolver códigos de error, no usar un estado de error global como errno) y excepciones.
Vale la pena señalar que si se utiliza el operador nuevo en su código sin especificar nothrow en todas partes, por ejemplo:
int* p = new int(123); // can throw std::bad_alloc
int* p = new(std::nothrow) int(123); // returns a null pointer on failure
... entonces ya necesario capturar y manejar excepciones bad_alloc en su código para que se ser robusto contra excepciones de falta de memoria.
Utilice la excepción para ERRORES EXCEPCIONALES (http://stackoverflow.com/questions/180937/are-exceptions-really-for-exceptional-errors). Para errores comunes y recurrentes, puede probar las nuevas instalaciones de system_error en C++ 0x http://blog.think-async.com/2010/04/system-error-support-in-c0x-part-1.html. Hay una implementación de impulso. – anno
Deberías usar ambos. Cuál depende de la situación. ver http://stackoverflow.com/questions/106586/what-are-the-principles-guiding-your-exception-handling-policy/106749#106749 –
anno: El enlace al que hace referencia parece estar en desacuerdo con la palabra " excepcional "- que tiene mucho sentido para mí. Después de todo, no puedes predecir cuáles serán los errores comunes. – Ken