¿Hay alguna referencia acerca de las excepciones de la biblioteca estándar de C++? Solo quiero saber qué funciones pueden arrojar una excepción o no.Lista de excepciones de la biblioteca estándar de C++?
Respuesta
En realidad, la mayor parte de la función de biblioteca estándar no arroja excepciones. Simplemente transmiten la excepción arrojada por el código de usuario invocado por ellos. Por ejemplo, si push_back()
un elemento a un vector, esto puede arrojar (debido a errores de asignación de memoria y) si el constructor de copia del objeto arroja.
Entre las pocas excepciones (sin doble sentido) en funciones de biblioteca tiran son:
- Algunos métodos arrojan
out_of_range
si el índice proporcionado no es válido:std::vector<>::at()
std::basic_string<>::at()
std::bitset<>::set()
,reset()
yflip()
.
- Algunos métodos arrojarán
std::overflow_error
en desbordamiento de enteros:std::bitset<>::to_ulong()
y (C++ 0x)to_ullong()
.
std::allocator<T>
pasará enstd::bad_alloc
lanzada pornew
que invoca.- Las transmisiones se pueden configurar para que se genere
std::ios_base::failure
cuando se establece un bit de estado. - asignaciones de matriz grandes pueden lanzar
std::bad_array_new_length
- dynamic_cast en una referencia puede lanzar una (técnicamente no es parte de la biblioteca estándar)
std::bad_cast
- lanzar una excepción no válido de una función con una especificación de excepción lanzará una
std::bad_exception
- Llamar a
std::function::operator(...)
si no tiene valor arrojarástd::bad_function_call
. - El uso de
typeinfo
de un puntero nulo puede arrojar unstd::bad_typeid
. - Accediendo a
weak_ptr
después de que se haya lanzado la punta lanzarástd::bad_weak_ptr
. - El uso incorrecto de
std::promise/std::future
puede arrojar unstd::future_error
. - (C++ 11) Las funciones de conversión de cadena
std::stoi
,std::stol
,std::stoll
,std::stoul
,std::stoull
,std::stof
,std::stod
, ystd::stold
pueden tirar tantostd::invalid_argument
ystd::out_of_range
. - (C++ 11) En la familia de expresiones regulares, los constructores y los métodos de asignación pueden arrojar
std::regex_error
.
(que estoy haciendo de esta una respuesta CW, así que si alguien puede pensar en más tales, no dude en para añadir aquí.)
Además, para la tercera edición del El C++ Programming Language, Bjarne Stroustrup tiene un archivo descargable appendix about exception safety, que puede ser relevante.
+1 para el enlace. Acabo de comenzar a leerlo. –
Gracias por su respuesta. Por cierto, ¿cuál es la respuesta de CW? – Brian
@Brian: Es "wiki de la comunidad". Otros son libres de editar cualquier respuesta CW (incluso cuando no tienen el representante para editar las respuestas normalmente). – sbi
Las únicas funciones garantizados (por el compilador) no tirar son las funciones que tienen la especificación throw()
excepción, como esto:
void ThisFunctionNeverThrows() throw()
{
}
De lo contrario, cualquier otra función potencialmente puede generar una excepción, a menos que estén específicamente documentado de otra manera. Debe considerar la seguridad de excepciones al escribir el código frente a las excepciones.
Consulte el artículo de Bjarne Stroustup sobre seguridad de excepciones y la biblioteca estándar: http://www2.research.att.com/~bs/3rd_safe.pdf A partir de la página 19 en el PDF puede encontrar información sobre las garantías hechas por los contenedores estándar.
Esto no es correcto como muchos contenedores, p. garantizar que no se arroje 'borrar()', pero esta función no es 'throw()'. Desde el punto de vista del lenguaje, lo que usted escribió tiene sentido, pero existen otras garantías que las específicamente aplicadas por el compilador. – doublep
@doublep: 'erase()' * arrojará * si el constructor de copia del tipo de elemento arroja. – kennytm
De la página 21 en el PDF que mencioné (Garantías para 'vector' y' deque'): "A menos que sea lanzado por el constructor de copia o el operador de asignación del tipo de elemento, no' erase() 'arroja una excepción." –
- 1. ¿Hay una lista de interfaces de biblioteca estándar de C++ 11 que requieren excepciones habilitadas?
- 2. versiones de la biblioteca estándar de C++
- 3. Incluir biblioteca estándar de C++
- 4. Localización de C biblioteca estándar
- 5. Trabajo interno de la biblioteca estándar C
- 6. Biblioteca estándar Intel (C++)
- 7. Biblioteca estándar madura para C
- 8. trim no es parte de la biblioteca c/C++ estándar?
- 9. Etiquetas de biblioteca estándar
- 10. C++ 0x biblioteca estándar manual de referencia
- 11. declaración de C Biblioteca señal estándar
- 12. Java, excepciones específicas de clase frente a excepciones estándar
- 13. ¿Cuál es la diferencia entre la biblioteca estándar y la biblioteca de plantillas estándar?
- 14. lista de excepciones
- 15. Vinculación de la biblioteca C con nombre no estándar
- 16. ¿Extender la biblioteca estándar de C++ por herencia?
- 17. Cómo reemplazar la función de biblioteca estándar C?
- 18. Definición estándar de la lista
- 19. ¿Tiene C o C++ una biblioteca de expresiones regulares estándar?
- 20. ¿Qué clases de excepción hay en la biblioteca estándar de C++?
- 21. ¿La biblioteca estándar de Python es realmente estándar?
- 22. ¿Dónde está la biblioteca C estándar en Mac OS X?
- 23. ¿Documentación estándar de la biblioteca SBCL?
- 24. ¿IronPython implementa la biblioteca estándar de Python?
- 25. Versión imprimible de la biblioteca estándar Haskell
- 26. Biblioteca de estructura de datos estándar en C?
- 27. ¿Cuáles son algunas de las mejores prácticas de uso de la Biblioteca estándar de C++?
- 28. ¿Qué son las excepciones estándar de Scala?
- 29. Diferencia entre la biblioteca C estándar y la biblioteca C POSIX
- 30. Implementación estándar de una lista vinculada en C
Relacionados: http://stackoverflow.com/questions/11938979/what-exception-classes-are-in-the-standard-c-library –