1. UNIVERSIDAD AUTÓNOMA DEL ESTADO DE MÉXICO CENTRO
UNIVERSITARIO UAEM ATLACOMULCO
AUTÓMATAS Y LENGUAJES FORMALES
ALUMNA:
ALETVIA JACQUELINE LEÓN VENEGAS
TEMAS:
MANEJO DE EXCEPCIONES
LA CLASE STRING Y EL PROCESAMIENTO DE FLUJO DE CADENA
ING. HECTOR CABALLERO HERNANDEZ
INGENIERÍA EN COMPUTACIÓN
ICO-19
ATLACOMULCO, MÉX. A 20 DE ABRIL DE 2015.
2. ÍNDICE
MANEJO DE EXCEPCIONES……………………………………………………… 1
LA CLASE STRING Y EL PROCESAMIENTO DE FLUJO DE CADENA......... 6
BIBLIOGRAFÍA…………………………………………………………………….. 10
3. MANEJO DE EXCEPCIONES
El manejo de excepciones permite al programador remover el código para manejo de errores
de la “línea principal” de ejecución del programa, lo cual mejora la claridad y capacidad de
modificación del mismo. Los programadores pueden optar por manejar cualquier excepción que
deseen; esta flexibilidad reduce la probabilidad de que los errores se pasen por alto y, por
consecuencia, hace que los programas sean más robustos.
La clase runtime_error, una clase derivada de la clase exception, es la base estándar de C++
para representar errores en tiempo de ejecución. La clase exception es la clase base estándar de C++
para todas las excepciones. Una clase de excepción típica que se deriva de la clase runtime_error
define solo un constructor que pasa una cadena de mensaje de error al constructor de la clase base
runtime_error. Cada clase de excepción que se deriva de forma directa o indirecta de exception
contiene la función virtual what, la cual devuelve el mensaje de error de un objeto excepción.
ENCERRAR CÓDIGO EN UN BLOQUE TRY
El manejo de excepciones está orientado a situaciones en las que la función que detecta un
error no puede manejarlo.
C++ proporciona bloques try para permitir el manejo de excepciones. Un bloque try consiste
en la palabra clave try, seguida de llaves ({}) que definen un bloque de código en el que podrían
ocurrir errores. El bloque try encierra instrucciones que podrían ocasionar excepciones, e
instrucciones que se deberían omitir si ocurre una excepción. Las excepciones pueden surgir a
través de código mencionado de forma explícita en un bloque try, a través de las llamadas a otras
funciones y a través de llamadas a funciones con muchos niveles de anidamiento, iniciadas por el
código en un bloque try.
DEFINICIÓN DE UN MANEJADOR CATCH
Las excepciones se procesan mediante los manejadores catch que atrapan y manejan las
excepciones. Cada manejador catch empieza con la palabra clave catch y especifica entre paréntesis
un parámetro de excepción que representa el tipo de excepción que puede procesar el manejador
catch. Cuando ocurre una excepción en un bloque try, el manejador catch que se ejecuta es aquél
cuyo tipo coincide con el tipo de la excepción que ocurrió. Si un parámetro de excepción incluye un
nombre de parámetro opcional, el manejador catch puede usar ese nombre de parámetro para
1
4. interactuar con la excepción atrapada en el cuerpo del manejador catch, que está delimitado por
llaves ({y}). Por lo general, un manejador catch reporta el error al usuario, lo registra en un archivo,
termina el programa sin que haya pérdida de datos o intenta una estrategia alterna para realizar la
tarea fallida.
MODELO DE TERMINACIÓN DEL MANEJO DE EXCEPCIONES
Si ocurre una excepción como resultado de una instrucción en un bloque try, este bloque
expira. A continuación, el programa busca el primer manejador catch que pueda procesar el tipo de
excepción que ocurrió. El programa localiza el catch que coincida, comparando el tipo de excepción
lanzada con el tipo del parámetro de excepción de cada catch, hasta que el programa encuentra una
coincidencia. Cuando ocurre una coincidencia, se ejecuta el código contenido en el manejador catch
que coincide. Cuando un manejador catch termina su procesamiento al llegar a su llave derecha de
cierre (}), se considera que la excepción se manejó y las variables locales definidas dentro del
manejador catch queda fuera de alcance. El control del programa no regresa al punto en el que
ocurrió la excepción debido a que el bloque try ha expirado. El control continúa con la primera
instrucción después del último manejador catch que sigue del bloque try. A eso se le conoce como
modelo de terminación del manejo de excepciones.
Si el bloque try completa su ejecución con éxito, entonces el programa ignora los manejadores
catch y el control del programa continua con la primera instrucción después del último bloque catch
que sigue de ese bloque try.
Si una excepción que ocurre en un bloque try no tiene un manejador catch que coincida, o si
una excepción ocurre en una instrucción que no se encuentre dentro de un bloque try, la función que
contiene la instrucción termina de inmediato y el programa intenta localizar un bloque try
circundante en la función que hizo la llamada. A este proceso se le conoce como limpieza de la
pila.
Para lanzar una excepción, se utiliza la palabra clave throw seguida de un operador que
representa el tipo de excepción a lanzar. Por lo general, una instrucción throw especifica un
operando, esté operando puede ser de cualquier tipo. Si el operando es un objeto, lo llamamos
objeto excepción. Sin embargo, un operador de throw también puede asumir otros valores, como el
valor de una expresión que no produce un objeto o el valor de un int. El operando throw se utiliza
para inicializar el parámetro en el manejador catch. Esta es una característica central del manejo de
2
5. excepciones: una función debe lanzar una excepción antes de que el error tenga la oportunidad de
manifestarse.
CUANDO UTILIZAR EL MANEJO DE EXCEPCIONES
El manejo de excepciones está diseñado para procesar errores síncronos, que ocurren cuando
se ejecuta una instrucción. El manejo de excepciones no está diseñado para procesar los errores
asociados con los eventos síncronos los cuales ocurren en paralelo con, y de manera independiente
a, el flujo de control del programa. El mecanismo de manejo de errores también es útil para
procesar problemas que ocurren cuando un programa interactúa con los elementos de software, con
las funciones miembro, los constructores, los destructores y las clases. En vez de manejar los
problemas de manera interna, dichos elementos de software utilizan comúnmente las excepciones
para notificar a los programas cuando ocurren problemas.
VOLVER A LANZAR UNA EXCEPCIÓN
Es posible que un manejador de excepciones, al momento de recibir una excepción, decida que
no puede procesar esa excepción o que puede procesar la excepción solo de manera parcial. En
tales casos, el manejador de excepciones puede diferir el manejo de excepciones a otro manejador
de excepciones. En cualquier caso, para lograr esto hay que volver a lanzar la excepción mediante
la siguiente instrucción: throw;
ESPECIFICACIONES DE EXCEPCIONES
Una especificación de excepciones opcional encuentra una lista de excepciones que puede
lanzar una función. Una función solo puede lanzar excepciones de los tipos indicados por la
especificación, o excepciones de cualquier tipo derivado de estos tipos. Si la función lanza una
excepción que no pertenezca a un tipo especificado, el mecanismo de manejo de excepciones llama
a la función unexpected, la cual termina el programa. Una función que no proporciona una
especificación de excepciones puede lanzar cualquier excepción. Al colocar throw() después de la
lista de parámetros de una función, se establece que esta función no lanza excepciones. Si la función
intenta lanzar una excepción, se invoca la función unexpected.
3
6. PROCESAMIENTO DE EXCEPCIONES INESPERADAS
La función unexpected llama a la función registrada con la función set_unexpected. Si no se ha
registrado una función de esta forma, se hace una llamada a la función terminate de manera
predeterminada. Los casos en los que se hace una llamada a la función terminate son:
1. El mecanismo de excepción no puede encontrar un catch que coincida para una excepción
que se haya lanzado.
2. Un destructor intenta lanzar una excepción durante la limpieza de la pila.
3. Hay un intento de volver a lanzar una excepción cuando no se esté manejando una
excepción en un momento dado.
4. Una llamada a la función unexpected realiza una llamada a la función terminate de manera
predeterminada.
La función set_terminate puede especificar la función a invocar cuando se haga la llamada a
terminate. En caso contrario, terminate llama a abort, con lo cual se termina el programa sin llamar
a los destructores de cualquier objeto restante de una clase de almacenamiento estático o
automático. Esto podría conllevar a fugas de recursos cuando un programa termina en forma
prematura. Las funciones set_terminate y set_unexpected devuelven un apuntador a la última
función llamada por terminate y unexpected, respectivamente. Las funciones set_terminate y
set_unexpected reciben como argumentos apuntadores a funciones con tipos de valores de retorno
void y sin argumentos.
LIMPIEZA DE LA PILA
Cuando se lanza una excepción pero no se atrapa en un alcance en específico, la pila de
llamadas a funciones se “limpia” y se hace un intento de atrapar (catch) la excepción en el siguiente
bloque try. Limpiar la pila de llamadas a funciones significa que la función en la que no se atrapó la
excepción termina, todas las variables locales en la función se destruyen y el control regresa a la
instrucción que invocó originalmente a esa función.
CONSTRUCTORES, DESTRUCTORES Y MANEJO DE EXCEPCIONES
Las excepciones lanzadas por un constructor hacen que se llame a los destructores de todos los
objetos creados como parte del objeto que se está construyendo, antes de que se lance la excepción.
Cada objeto automático construido en un bloque try se destruye antes de lanzar una excepción. La
4
7. limpieza de la pila se completa antes de que un manejador de excepciones empiece a ejecutarse. Si
un destructor invocado como resultado de la limpieza de la pila lanza una excepción, se hace una
llamada a terminate. Si un objeto tiene objetos miembros, y si se lanza una excepción antes de que
el objeto exterior este completamente construido, entonces se ejecutaran los destructores de los
objetos miembro que se hayan construido antes de que ocurra la excepción. Si se han construido
parcialmente un arreglo de objetos cuando ocurre una excepción, solo se llamara a los destructores
para los objetos elementos del arreglo que estén construidos. Cuando se lanza una excepción desde
el constructor para un objeto que se crea en una excepción new, se libera la memoria asignada en
forma dinámica para ese objeto.
PROCESAMIENTO DE LAS FALLAS DE NEW
El estándar de C++ especifica que, cuando falla el operador new, lanza una excepción
bad_alloc.
MANEJO DE LAS FALLAS DE NEW MEDIANTE LA FUNCIÓN SET_NEW_HANDLER
Una característica adicional para manejar las fallas de new es la función set_new_handler. Esta
función recibe como argumento un apuntador a una función que no recibe argumentos y devuelve
void. Una vez que set_new_handler registra un manejador de new en el programa, el operador new
no lanza bad_alloc en el futuro. El estándar de C++ especifica que la función manejadora de new
debe realizar una de las siguientes tareas:
1. Hacer mas memoria disponible al eliminar otra parte de la memoria asignada en forma
dinámica y regresar al operador new para tratar de asignar memoria otra vez.
2. Lanzar una excepción de tipo bad_alloc.
3. Llamar a la función abort o exit para terminar el programa.
LA CLASE AUTO_PTR Y LA ASIGNACIÓN DINÁMICA DE MEMORIA
Un objeto de la clase auto_ptr mantiene un apuntador a la memoria que se asigna en forma
dinámica. Cuando se hace una llamada al destructor de un objeto auto_ptr, realiza una operación
delete con su miembro de datos apuntador. La plantilla de clase auto_ptr proporciona los
operadores sobrecargados * y ->, de manera que un objeto auto_ptr se puede utilizar de la misma
forma que una variable apuntador común.
5
8. JERARQUÍA DE EXCEPXIONES DE LA BIBLIOTECA ESTÁNDAR
La Biblioteca estándar de C++ incluye una jerarquía de clases de excepciones. Esta jerarquía
está encabezada por la clase base exception. Algunas derivadas y sus funciones son las siguientes:
logic_error: es la clase base de varias clases de excepciones estándar que indican errores en la
lógica del programa.
invalid_argument: indica que se pasó un argumento inválido a una función.
length_error: indica que para ese objeto se objeto se utilizo una longitud mayor que el tamaño
máximo permitido para el objeto que se está manipulando.
out_of_range: indica que un valor, como un subíndice en un arreglo, excedió su rango
permitido de valores.
runtime_error: indica errores en tiempo de ejecución.
overflow_error: describe un error de desbordamiento aritmético.
underflow_error: describe un error de subdesbordamiento.
LA CLASE STRING Y EL PROCESAMIENTO DE FLUJOS DE CADENA
La plantilla de clase basic_string proporciona operaciones comunes de manipulación de
cadenas, como copiar, realizar búsquedas, etc. La definición de la plantilla y todas las herramientas
de soporte se definen en el espacio de nombres, éstas incluyen la instrucción typedef, ésta se
proporciona para el tipo wchar_t. el tipo wchar_t almacena caracteres para soportar otros conjuntos
de caracteres.
La longitud de un objeto string se puede obtener mediante la función miembro length y
mediante la función miembro size. El operador subíndice ([]), se puede utilizar con objetos string
para acceder a los caracteres individuales y modificarlos.
ASIGNACIÓN Y CONCATENACIÓN DE OBJETOS STRING
La clase string proporciona el operador operator = sobrecargado y la función miembro assign
para asignaciones de de objetos string. El operador subíndice ([]) proporciona acceso de
lectura/escritura para cualquier elemento de un objeto string. La función miembro at de string
proporciona acceso comprobado; al ir mas allá de cualquiera de los extremos del objeto string se
lanza una excepción out_of_range. El operador subíndice ([]) no proporciona acceso comprobado.
La clase string proporciona los operadores + y += sobrecargados, y la función miembro append
para realizar la concatenación de objetos string.
6
9. COMPARACION DE OBJETOS STRING
La clase string proporciona los operadores sobrecargados ==, ¡=, <, >, <´= y >= para las
comparaciones de objetos string. La función miembro compare de string compara dos objetos
string y devuelve 0 si los objetos string son iguales, un número positivo si el primer objeto string es
lexicográficamente mayor que el segundo, o un número negativo si el primer objeto string es
lexicográficamente menor que el segundo.
SUBCADENAS
La clase string proporciona la función miembro substr para obtener una subcadena de un
objeto string. El resultado es un nuevo objeto string que se copia del objeto string de origen.
INTERCAMBIO DE OBJETOS STRING
La clase string proporciona la función miembro swap para intercambiar objetos string. La
función miembro swap de string es útil para implementar programas que ordenan cadenas.
CARACTERÍSTICAS DE LOS OBJETOS STRING
La clase string proporciona funciones miembro para recopilar información acerca del tamaño
de un objeto string, su longitud, capacidad, longitud máxima y otras características. El tamaño o la
longitud de un objeto string es el número de caracteres actualmente almacenados en el objeto string.
La capacidad de un objeto string es el número de caracteres que se pueden almacenar en el objeto
string sin necesidad de asignar más memoria. La capacidad de un objeto string debe ser cuando
menos igual a su tamaño actual, aunque puede ser mayor. La capacidad exacta de un objeto string
depende de la implementación. El tamaño máximo es el mayor tamaño posible que puede tener un
objeto string. Si se excede este valor, se lanza una excepción length_error.
BÚSQUEDA DE SUBCADENAS Y CARACTERES EN UN OBJETO STRING
La clase string proporciona funciones miembro const para buscar subcadenas y caracteres en
un objeto string. Algunas funciones derivadas y sus funciones son:
rfind: realiza una búsqueda inversa en una cadena.
find_first_of: localiza la primer ocurrencia de cualquier carácter.
find_last_of: busca la última ocurrencia de cualquier carácter.
find_first_not_of: busca el primer carácter que no está contenido en una cadena, la búsqueda se
realiza desde el final de la cadena. El objeto string en el que se realiza la búsqueda contiene
cada carácter especificado en el argumento de cadena. Si no se encuentra el carácter, se
devuelve string::npos.
7
10. REEMPLAZO DE CARACTERES EN UN OBJETO STRING
La función miembro erase de string sirve para borrar todo. Se utiliza find para localizar cada
ocurrencia del carácter de espacio. Cada espacio se reemplaza con un punto mediante una llamada a
la función miembro replace de string. La función replase recibe tres argumentos: el subíndice del
carácter en el objeto string en el que debe empezar el reemplazo, el número de caracteres a
reemplazar y la cadena de reemplazo. La función miembro find devuelve string::npos cuando no se
encuentra el carácter de búsqueda.
INSERCIÓN DE CARACTERES EN UN OBJETO STRING
La clase string proporciona funciones miembro para insertar caracteres en un objeto string. La
función miembro insert de string para insertar el contenido de una cadena antes del elemento 10 de
la otra cadena. Los últimos dos argumentos especifican los elementos iniciales y final de una cadena
que se debe insertar. Al utilizar string::npos, se inserta todo el objeto string.
CONVERSIÓN A CADENAS ESTILO C
La clase string proporciona funciones miembro para convertir objetos de la clase string en
cadenas basadas en apuntadores estilo C. se utiliza la función miembro copy de string para copiar el
objeto de una cadena en el arreglo char al que apunta ptr2. Se utiliza la función c_str para obtener
un apuntador const char* que apunte a una cadena estilo C con terminación nula. El apuntador se
para al operador de inserción de flujo para la salida. Se asigna al operador const char*ptr1 un
apuntador devuelto por la función miembro data de la clase string. Esta función miembro devuelve
un arreglo de caracteres estilo C sin terminación nula.
ITERADORES
La clase string proporciona iteradores para realizar recorridos hacia adelante y hacia atrás de
objetos string. Los iteradores proporcionan acceso a los caracteres individuales con una sintaxis
similar a las operaciones de los operadores. Un const_iterator es un iterator que no puede modificar
el objeto string; en este caso, el objeto string a través del cual esta iterando. Existen dos versiones
de begin: una que devuelve un iterator para iterar a través de un objeto string no const y una versión
const que devuelve un const_iterator para iterar a través de un objeto const_string. La función
miembro end de la clase string devuelve un objeto iterator para la posición que esta mas allá del
último elemento de la cadena. La clase string proporciona las funciones miembro rend y rbegin
para acceder a los caracteres individuales de un objeto string en forma inversa, desde el final de un
objeto string hacia su inicio. Las funciones miembro rend y rbegin devuelven objetos
reverse_iterator o const_reverse_iterator.
PROCESAMIENTO DE FLUJOS DE CADENA
Además de la E/S de flujos estándar y la E/S de flujos de archivos, en C++ la E/S de flujos
incluye herramientas para recibir datos de objetos string en la memoria. A estas herramientas se les
conoce como E/S en memoria o procesamiento de flujos de cadena. La entrada desde un objeto
8
11. string está soportada por la clase istringstream. La salida hacia un objeto string esta soportada por
la clase ostringstream. Los nombres de las clases istringstream y ostringstream son en realidad
alias definidos por las siguientes definiciones typedef.
typedef basic_istringstream< char > istringstream;
typedef basic_ostringstream< char > ostringstream;
La plantilla de clase basic_istringstream y basic_ostringstream proporciona la misma
funcionalidad que las clases istream y ostream, además de otras funciones miembro específicas para
el formato en memoria. Una aplicación para estas técnicas es la validación de datos. Un objeto
ostringstream utiliza un objeto string para almacenar los datos de salida. La función miembro str de
la clase ostringstream devuelve una copia de ese objeto string. Un objeto istringstream introduce
datos desde un objeto string en memoria a las variables del programa. Los datos se almacenan en un
objeto istringstream como caracteres. La operación de entrada desde el objeto istringstream
funciona de manera idéntica a las operaciones de entrada desde cualquier archivo. El objeto
istringstream interpreta el final del objeto string como el fin de archivo.
9
12. BIBLIOGRAFÍA
DEITEL, HARVEY M. Y PAUL J. DEITEL
Cómo programar en C++. Sexta edición
PEARSON EDUCACIÓN, México 2008
Páginas:
Manejo de exención 682 - 707
La clase string y el procesamiento de flujo de cadena 745 - 768
10