2010-05-16 30 views
14

¿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++?

+0

Relacionados: http://stackoverflow.com/questions/11938979/what-exception-classes-are-in-the-standard-c-library –

Respuesta

19

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() y flip().
  • 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á en std::bad_alloc lanzada por new 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 un std::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 un std::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, y std::stold pueden tirar tanto std::invalid_argument y std::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.

+0

+1 para el enlace. Acabo de comenzar a leerlo. –

+0

Gracias por su respuesta. Por cierto, ¿cuál es la respuesta de CW? – Brian

+0

@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

1

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.

+0

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

+0

@doublep: 'erase()' * arrojará * si el constructor de copia del tipo de elemento arroja. – kennytm

+0

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." –

Cuestiones relacionadas