12
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.

3...3 manejo de excepciones y la clase string

Embed Size (px)

Citation preview

Page 1: 3...3 manejo de excepciones y la clase string

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.

Page 2: 3...3 manejo de excepciones y la clase string

ÍNDICE

MANEJO DE EXCEPCIONES……………………………………………………… 1

LA CLASE STRING Y EL PROCESAMIENTO DE FLUJO DE CADENA......... 6

BIBLIOGRAFÍA…………………………………………………………………….. 10

Page 3: 3...3 manejo de excepciones y la clase string

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

Page 4: 3...3 manejo de excepciones y la clase string

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

Page 5: 3...3 manejo de excepciones y la clase string

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

Page 6: 3...3 manejo de excepciones y la clase string

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

Page 7: 3...3 manejo de excepciones y la clase string

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

Page 8: 3...3 manejo de excepciones y la clase string

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

Page 9: 3...3 manejo de excepciones y la clase string

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

Page 10: 3...3 manejo de excepciones y la clase string

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

Page 11: 3...3 manejo de excepciones y la clase string

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

Page 12: 3...3 manejo de excepciones y la clase string

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