tipos de errores de
programación
Otras versiones
Errores de compilación
Los errores de compilación, también conocidos como errores del compilador, son errores que impiden que su
programa se ejecute. Cuando presiona F5 para ejecutar un programa, Visual Basic compila el código en un
lenguaje binario que el equipo entiende. Si el compilador de Visual Basic se encuentra con código que no
entiende, emite un error de compilador.
La mayoría de los errores del compilador se deben a errores cometidos al escribir el código. Por ejemplo, puede
escribir mal una palabra clave, omitir alguna puntuación necesaria o intentar utilizar una instrucción End If sin
antes utilizar una instrucción If.
Afortunadamente, el editor de código de Visual Basic se diseñó para identificar estos errores antes de que se
intente ejecutar el programa. Aprenderá a encontrar y corregir los errores de compilación en la lección
siguiente, Encontrar y eliminar errores del compilador.
Errores lógicos
Los errores lógicos son errores que impiden que su programa haga lo que estaba previsto. Su código puede
compilarse y ejecutarse sin errores, pero el resultado de una operación puede generar un resultado no esperado.
Por ejemplo, puede tener una variable llamada FirstName y establecida inicialmente en una cadena vacía.
Después en el programa, puede concatenar FirstName con otra variable denominada LastName para mostrar un
nombre completo. Si olvida asignar un valor a FirstName, sólo se mostrará el apellido, no el nombre completo
como pretendía.
Los errores lógicos son los más difíciles de detectar y corregir, pero Visual Basic también dispone de
herramientas de depuración que facilitan el trabajo. Aprenderá a encontrar y corregir los errores lógicos
en ¿Qué? Esto no debiera haber ocurrido. Encontrar errores lógicos.
Pasos siguientes
En esta lección, obtuvo información sobre las tres categorías de errores de programación. En la lección siguiente
obtendrá información sobre cómo depurar los errores del compilador.
Siguiente lección: Encontrar y eliminar errores del compilador
CLASIFICACIÓN DE ERRORES.
Los errores en un programa o algoritmo se pueden clasificar en distintos tipos. Atendiendo a los efectos que ocasionan se
podría hablar de errores que impiden la ejecución de un programa y errores que no impiden la ejecución de un programa.
Atendiendo al momento en que se producen podríamos hablar de errores de compilación y errores de ejecución. Lo vemos en
forma de esquemas:
Cuando una vez tenemos escrito el código del programa y ordenamos su ejecución, se produce una “lectura de interpretación”
previa llamada compilación. Recordemos que el ordenador no interpreta directamente las órdenes que le damos sino que
necesita una traducción. Si durante esa traducción se detecta un problema el programa no comienza a ejecutarse. Lo más
habitual es que se detecten fallos de sintaxis, ciertos procesos no válidos e incluso errores lógicos tipo bucle infinito en algunas
circunstancias. Si el programa no compila estamos obligados a realizar las correcciones oportunas antes de poder ejecutarlo.
Durante la ejecución del programa pueden producirse errores previsibles porque se derivan del código o imprevisibles por ser
Un error de ejecución puede ser gestionado (vía detección o vía lógica) pero uno de compilación no.
Hay errores cuya clasificación no es sencilla. Por ejemplo, si al usuario se le pide un número entero durante la ejecución del
programa, pero introduce uno real, se puede producir un error de ejecución por proceso no válido. Sin embargo, el trasfondo
del error es lógico: el programa no está preparado para reaccionar ante una situación que es posible. A estos errores los
ERRORES. INTRODUCCIÓN.
Llamamos error a cualquier circunstancia que da lugar a un malfuncionamiento de un programa. Por malfuncionamiento se
entiende una respuesta indeseada: desde meros problemas estéticos hasta graves fallos o bloqueos.
Intuitivamente tenemos muchas ideas relacionadas con los errores. Aplicado al devenir diario, estamos acostumbrados a hablar
De un coche por ejemplo, puede decirse que “está perfecto” o “tiene un pequeño fallo pues hace un ruidito la correa, pero anda
bien”. Otras veces diremos que “está teniendo problemas graves con el cambio de marchas” o “se paró y tuve que llamar a una
grúa”. Con los programas informáticos pasa algo similar: pueden presentar fallos leves o casi despreciables, fallos
notables pero aún así funcionan y fallos totales en determinadas circunstancias. Sin duda, la mejor situación es la del
programa libre de errores. O dicho de otra manera: el mejor error es el que no existe.
¿Cómo construir programas sin errores? Si tuviéramos la respuesta a esta pregunta quizás fuéramos presidentes de alguna
multinacional, pues es algo a lo que muchísima gente intenta responder. Pero aún no teniéndola, quizás sí podemos indicar
· La experiencia derivada de enfrentarnos a errores y buscarles solución nos permite mejorar como programadores. Un
· Existen metodologías contrastadas que son efectivas para evitar la aparición de errores. Son lo que globalmente se llama
“buenas prácticas de programación” y comprenden multitud de pautas de diseño y construcción de programas, muchas de las
cuales han sido ya expuestas. Estas pautas van desde meras cuestiones de presentación hasta aspectos fundamentales de la
programación. Si algo hemos hecho en estas páginas es hablar de método y de diseño. No vamos a extendernos en esto ahora.
Sí queremos recordar que cuestiones aparentemente sencillas como asumir que “se recomienda no escribir muchas órdenes en
una sola línea” pueden suponernos grandes ventajas. Y ello, sin esfuerzo. Es suficiente con tener método.
· Es importante diseñar y verificar módulos o algoritmos independientes para luego realizar integraciones que habrá a su vez
que verificar. Integrar partes no verificadas supone crear estructuras de difícil verificación y corrección.
· Programar requiere concentración y dedicación. Igual que no imaginamos una partida de ajedrez en un entorno de ruidos y
distracciones, no pensemos que podemos programar en cualquier ambiente. Un buen programador distraído o preocupado en
hemos de asumirlo. Por suerte o por desgracia vamos a tener que convivir con errores, independientemente de que pongamos
más o menos medios para evitarlos. Si esto es así, el programador no “odia” los errores. Al programador “le interesan” los
TIPOS DE ERRORES
Hay distintos tipos de errores y distintas formas de clasificarlos. Vamos a ver primero una serie de definiciones para luego ver
las clasificaciones. Los cuatro tipos básicos de errores son: de sintaxis, por proceso no válido, lógicos tipo bucle infinito y lógicos
ERRORES DE SINTÁXIS
Son todos aquellos que se generan por infringir las normas de escritura de un lenguaje. Suelen deberse a olvidos o a
desconocimiento (programadores principiantes) y comprenden falta o mal uso de elementos separadores (comas, puntos y
comas, dos puntos, etc.), palabras mal escritas (por ejemplo Mietras en vez de Mientras o Finelizar en vez de Finalizar).
Suelen ser errores obvios y fáciles de detectar. La mayoría de los lenguajes tienen herramientas de ayuda para facilitar la
escritura y la corrección del código desde el punto de vista sintáctico. Además, en general, no es posible la ejecución de un
programa con errores de sintaxis y se insta al programador a su corrección en los distintos puntos donde pueda haber
problemas por parte del programa de gestión del lenguaje que se esté utilizando.
Téngase en cuenta que aparte de olvidos, escritura incorrecta de signos, palabras mal escritas, etc. la omisión de términos
obligatorios también será considerada error de sintaxis. Por ejemplo un Si que no se cierra con un FinSi o un Repetir que no se
Cada lenguaje tiene sus particularidades o formas de concepción. Cualquier sintaxis aparentemente correcta pero que infrinja
las normas de construcción de programas que define el lenguaje dará lugar a un error. Las posibilidades son muy variadas. Por
· Asignar un valor a la variable que no coincide con el tipo declarado para la variable.
Los procesos no válidos pueden deberse al programa o a circunstancias ajenas al programa, como que el usuario no introduzca
el dato esperado, que un señalero no esté donde tiene que estar, que los datos no estén ordenados como tenían que estarlo,
que un archivo no contenga la cantidad de datos que se espera o que un dato o fichero no esté donde se espera. Suelen ser
errores que se pueden detectar y gestionar. Su localización se ve facilitada por las herramientas de corrección o depuración del
ERRORES LÓGICOS
Son todos aquellos derivados de un mal diseño de los algoritmos o la arquitectura modular. Las posibilidades son muchas y los
efectos posibles también. Pueden ir desde el bloqueo o detención indeseada del programa hasta un resultado incorrecto, una
Los errores lógicos que afectan al desarrollo del programa son más fáciles de detectar que aquellos que no generan
aparentemente problemas. A su vez, de entre los que aparentan no suponer problema, los que generan muy pequeñas
disfunciones o desviaciones del resultado resultan más difíciles de detectar que los que dan lugar a resultados ostensiblemente
desviados de lo esperado.
Los errores lógicos son quizás los que más grandes quebraderos de cabeza originan a los programadores, los más difíciles de
evitar y los más difíciles de detectar. Un programa lleno de errores de sintaxis pero de lógica exquisita es una bendición
Evitar errores lógicos no pasa ya por conocer bien el lenguaje y las formas de construcción del lenguaje. Pasa por ser un buen
programador, un buen pensador. Y eso es difícil de enseñar o de aprender. Partamos de estrategias y métodos que se saben
1. Errores lógicos tipo bucle infinito: son aquellos que dan lugar a una parada o bloqueo del programa. Incluiremos aquí
procesos en realidad no infinitos pero que consumen un tiempo desmedido respecto a lo esperado.
2. Errores lógicos tipo resultado incorrecto: no bloquean el flujo del programa pero dan lugar a un resultado desviado. El
grado de desviación escaso puede dificultar su detección y corrección. El ordenador no puede saber que existe un error pues
sólo el programador que idea el proceso puede decir si éste es correcto o no.
Hasta aquí lo que hemos llamado cuatro tipos básicos de errores. Cuando existe un procedimiento a seguir previsto ante la
presencia de uno de estos errores decimos que se trata de un error gestionado. Ser gestionado es un atributo del error que
cambia sus propiedades. La naturaleza sigue siendo la misma pero los efectos no, al ser “controlados” o “encauzados”. Lo ideal
es que todos los errores posibles sean gestionados, pero esto no garantiza calidad ni buen funcionamiento del programa.
Únicamente asegura que el programador y/o usuario mantienen un cierto control del flujo del programa con el fin de poder
obtener resultados parciales, reorientar procesos o poder proceder a una salida controlada.
En la gestión del error normalmente interviene el propio programa. Cuando se produce el error, éste es detectado y se procede
a su gestión. Por tanto un error lógico tipo resultado incorrecto no puede ser gestionado por esta vía (a la que llamaremos
gestión vía detección) puesto que para el ordenador ese error no existe. La única posibilidad de gestionarlos es a su vez la vía
lógica a través de módulos de control de resultados, lo que según qué casos puede resultar muy complicado.
Errar es humano, a ensuciar realmente las cosas requiere de una computadora.” – Bill
Vaughan
“Un ordenador te permite cometer más errores más rápido que cualquier invención en la
historia de la humanidad -. Con la posible excepción de las pistolas y tequila” – Mitch
Ratcliffe
Descripción
La lógica de error
Este es quizás el más grave de todos los errores. Cuando un programa escrito en cualquier
lenguaje compila y se ejecuta correctamente sólo para proporcionar una salida incorrecta, la
falla se encuentra en la lógica de programación subyacente. Es un error que se ha heredado
de una falla en el algoritmo de base. La lógica misma sobre la que se basa la totalidad del
programa es defectuoso, en ese caso. Estos tipos de errores necesita un cambio fundamental
en su enfoque para encontrar una solución. Usted necesita comenzar a excavar en el nivel
algorítmico para reducir a la causa de tal error.
Error de sintaxis
Cada lenguaje de programación como C, Java, Perl y Python tiene una sintaxis específica en
la que el código debe ser escrito. Cuando un programador no se adhiere a la “gramática” de
las especificaciones de un lenguaje de computadora, aparece un error de sintaxis. Este tipo
de errores son fáciles de rectificar durante la fase de compilación.
Error de compilación
Error en tiempo
Un error aritmético
Muchos programas utilizan las variables numéricas y el algoritmo puede incluir una serie de
cálculos matemáticos. Errores aritméticos surgir cuando el equipo no puede manejar los
problemas como “División por cero ‘que lleva a un resultado infinito. Esto es de nuevo un
error de lógica que sólo se puede corregir cambiando el algoritmo.
Errores de recursos
Cuando el valor de una variable desborda su valor máximo permitido, un error de recurso
puede resultar. Desbordamiento de búfer, el uso de una variable no inicializada, violaciónes
de acceso y los desbordamientos de pila, son ejemplos de algunos errores de programación
comunes.
Interfaz de error
Tipos de Errores
¿Qué tipos de errores existen en programación?
En un programa, pueden existir tres tipos de errores:
De sintaxis (sintácticos).
De ejecución.
De lógica (lógicos).
Errores de sintaxis
Cuando en alguna instrucción del código fuente de un programa existe un error de sintaxis, dicho
error impedirá, tanto al compilador como al intérprete, traducir dicha instrucción, ya que, ninguno de
los dos entenderá qué le está diciendo el programador. Por ejemplo, en lenguaje C, si en vez de la
instrucción:
un programador escribe:
cuando el compilador o el intérprete lean esta línea de código, ninguno de los dos entenderá qué es
"prrintf" y, por tanto, no sabrán traducir esta instrucción a código máquina, por lo que, ambos
pararán la traducción y avisarán al programador con un mensaje de error.
En resumen, los errores de sintaxis se detectan en el proceso de traducción del código fuente a
código binario. Al contrario que ocurre con los errores de ejecución y de lógica, que sólo se pueden
detectar cuando el programa se está ejecutando.
Errores de ejecución
Un error de ejecución se produce cuando el ordenador no puede ejecutar alguna instrucción de
forma correcta. Por ejemplo, en lenguaje C, la instrucción:
c = 5 / 0;
es correcta sintácticamente y será traducida a código binario. Sin embargo, cuando la computadora
intente realizar la división:
5 / 0
Errores de lógica
En cuanto a los errores de lógica son los más difíciles de detectar. Cuando un programa no tiene
errores de sintaxis ni de ejecución, pero, aún así, no funciona bien, esto es debido a la existencia de
algún error lógico. De manera que, un error de lógica se produce cuando los resultados obtenidos
no son los esperados. Por ejemplo, en lenguaje C, si en vez de la instrucción:
c = a + b;
c = a * b;
hasta que no se mostrase por pantalla el resultado de la operación, el programador no podría darse
cuenta del error, siempre que ya supiese de antemano el resultado de la suma. En este caso, el
programdor podría percatarse del error fácilmente, pero, cuando las operaciones son más
complejas, los errores de lógica pueden ser muy difíciles de detectar.
9. Errores y excepciones
Hasta ahora los mensajes de error no habían sido más que mencionados, pero si probaste los ejemplos
probablemente hayas visto algunos. Hay (al menos) dos tipos diferentes de errores: errores de
sintaxis y excepciones.
El intérprete repite la línea culpable y muestra una pequeña ‘flecha’ que apunta al primer lugar donde se
detectó el error. Este es causado por (o al menos detectado en) el símbolo que precede a la flecha: en el
ejemplo, el error se detecta en la función print(), ya que faltan dos puntos (':') antes del mismo. Se
muestran el nombre del archivo y el número de línea para que sepas dónde mirar en caso de que la
entrada venga de un programa.
9.2. Excepciones
Incluso si la declaración o expresión es sintácticamente correcta, puede generar un error cuando se
intenta ejecutarla. Los errores detectados durante la ejecución se llamanexcepciones, y no son
incondicionalmente fatales: pronto aprenderás cómo manejarlos en los programas en Python. Sin
embargo, la mayoría de las excepciones no son manejadas por los programas, y resultan en mensajes de
error como los mostrados aquí:
>>> 10 * (1/0)
Traceback (most recent call last):
File "<stdin>", line 1, in ?
ZeroDivisionError: division by zero
>>> 4 + spam*3
Traceback (most recent call last):
File "<stdin>", line 1, in ?
NameError: name 'spam' is not defined
>>> '2' + 2
Traceback (most recent call last):
File "<stdin>", line 1, in ?
TypeError: Can't convert 'int' object to str implicitly
La última línea de los mensajes de error indica qué sucedió. Las excepciones vienen de distintos tipos, y
el tipo se imprime como parte del mensaje: los tipos en el ejemplo
son:ZeroDivisionError, NameError y TypeError. La cadena mostrada como tipo de la
excepción es el nombre de la excepción predefinida que ocurrió. Esto es verdad para todas las
excepciones predefinidas del intérprete, pero no necesita ser verdad para excepciones definidas por el
usuario (aunque es una convención útil). Los nombres de las excepciones estándar son identificadores
incorporados al intérprete (no son palabras clave reservadas).
La parte anterior del mensaje de error muestra el contexto donde la excepción sucedió, en la forma de
un trazado del error listando líneas fuente; sin embargo, no mostrará líneas leídas desde la entrada
estándar.
Primero, se ejecuta el bloque try (el código entre las declaración try y except).
Si no ocurre ninguna excepción, el bloque except se saltea y termina la ejecución de la
declaración try.
Si ocurre una excepción durante la ejecución del bloque try, el resto del bloque se saltea. Luego,
si su tipo coincide con la excepción nombrada luego de la palabra reservada except, se ejecuta
el bloque except, y la ejecución continúa luego de la declaración try.
Si ocurre una excepción que no coincide con la excepción nombrada en el except, esta se
pasa a declaraciones try de más afuera; si no se encuentra nada que la maneje, es
una excepción no manejada, y la ejecución se frena con un mensaje como los mostrados arriba.
Una declaración try puede tener más de un except, para especificar manejadores para distintas
excepciones. A lo sumo un manejador será ejecutado. Sólo se manejan excepciones que ocurren en el
correspondiente try, no en otros manejadores del mismo try. Un except puede nombrar múltiples
excepciones usando paréntesis, por ejemplo:
El último except puede omitir nombrar qué excepción captura, para servir como comodín. Usá esto con
extremo cuidado, ya que de esta manera es fácil ocultar un error real de programación. También puede
usarse para mostrar un mensaje de error y luego re-generar la excepción (permitiéndole al que llama,
manejar también la excepción):
import sys
try:
f = open('miarchivo.txt')
s = f.readline()
i = int(s.strip())
except OSError as err:
print("Error OS: {0}".format(err))
except ValueError:
print("No pude convertir el dato a un entero.")
except:
print("Error inesperado:", sys.exc_info()[0])
raise
Las declaraciones try ... except tienen un bloque else opcional, el cual, cuando está presente, debe
seguir a los except. Es útil para aquel código que debe ejecutarse si el bloque try no genera una
excepción. Por ejemplo:
El uso de else es mejor que agregar código adicional en el try porque evita capturar accidentalmente
una excepción que no fue generada por el código que está protegido por la declaración try ... except.
Cuando ocurre una excepción, puede tener un valor asociado, también conocido como el argumento de la
excepción. La presencia y el tipo de argumento depende del tipo de excepción.
El except puede especificar una variable luego del nombre de excepción. La variable se vincula a una
instancia de excepción con los argumentos almacenados en instance.args. Por conveniencia, la instancia
de excepción define __str__() para que se pueda mostrar los argumentos directamente, sin
necesidad de hacer referencia a .args. También se puede instanciar la excepción primero, antes de
generarla, y agregarle los atributos que se desee:
>>> try:
... raise Exception('carne', 'huevos')
... except Exception as inst:
... print(type(inst)) # la instancia de excepción
... print(inst.args) # argumentos guardados en .args
... print(inst) # __str__ permite imprimir args directamente,
... # pero puede ser cambiado en subclases de la exc
... x, y = inst # desempacar argumentos
... print('x =', x)
... print('y =', y)
...
<class 'Exception'>
('carne', 'huevos')
('carne', 'huevos')
x = carne
y = huevos
Si una excepción tiene argumentos, estos se imprimen como la última parte (el ‘detalle’) del mensaje para
las excepciones que no están manejadas.
Los manejadores de excepciones no manejan solamente las excepciones que ocurren en el bloque try,
también manejan las excepciones que ocurren dentro de las funciones que se llaman (inclusive
indirectamente) dentro del bloque try. Por ejemplo:
El único argumento a raise indica la excepción a generarse. Tiene que ser o una instancia de
excepción, o una clase de excepción (una clase que hereda de Exception).
Si necesitás determinar cuando una excepción fue lanzada pero no querés manejarla, una forma
simplificada de la instrucción raise te permite relanzarla:
>>> try:
... raise NameError('Hola')
... except NameError:
... print('Voló una excepción!')
... raise
...
Voló una excepción!
Traceback (most recent call last):
File "<stdin>", line 2, in ?
NameError: Hola
Las clases de Excepciones pueden ser definidas de la misma forma que cualquier otra clase, pero
usualmente se mantienen simples, a menudo solo ofreciendo un número de atributos con información
sobre el error que leerán los manejadores de la excepción. Al crear un módulo que puede lanzar varios
errores distintos, una práctica común es crear una clase base para excepciones definidas en ese módulo
y extenderla para crear clases excepciones específicas para distintas condiciones de error:
class Error(Exception):
"""Clase base para excepciones en el módulo."""
pass
class EntradaError(Error):
"""Excepción lanzada por errores en las entradas.
Atributos:
expresion -- expresión de entrada en la que ocurre el error
mensaje -- explicación del error
"""
class TransicionError(Error):
"""Lanzada cuando una operacion intenta una transicion de estado no
permitida.
Atributos:
previo -- estado al principio de la transición
siguiente -- nuevo estado intentado
mensaje -- explicación de por qué la transición no está permitida
"""
def __init__(self, previo, siguiente, mensaje):
self.previo = previo
self.siguiente = siguiente
self.mensaje = mensaje
La mayoría de las excepciones son definidas con nombres que terminan en “Error”, similares a los
nombres de las excepciones estándar.
Muchos módulos estándar definen sus propias excepciones para reportar errores que pueden ocurrir en
funciones propias. Se puede encontrar más información sobre clases en el capítulo Clases.
>>> try:
... raise KeyboardInterrupt
... finally:
... print('Chau, mundo!')
...
Chau, mundo!
KeyboardInterrupt
Traceback (most recent call last):
File "<stdin>", line 2, in ?
Una cláusula finally siempre es ejecutada antes de salir de la declaración try, ya sea que una excepción
haya ocurrido o no. Cuando ocurre una excepción en la cláusula try y no fue manejada por una
cláusula except (o ocurrió en una cláusula except o else), es relanzada luego de que se ejecuta la
cláusula finally. El finally es también ejecutado “a la salida” cuando cualquier otra cláusula de la
declaración try es dejada via break, continue or return. Un ejemplo más complicado:
Como podés ver, la cláusula finally es ejecutada siempre. La excepción TypeError lanzada al
dividir dos cadenas de texto no es manejado por la cláusula except y por lo tanto es relanzada luego de
que se ejecuta la cláusula finally.
En aplicaciones reales, la cláusula finally es útil para liberar recursos externos (como archivos o
conexiones de red), sin importar si el uso del recurso fue exitoso.
El problema con este código es que deja el archivo abierto por un periodo de tiempo indeterminado luego
de que esta parte termine de ejecutarse. Esto no es un problema en scripts simples, pero puede ser un
problema en aplicaciones más grandes. La declaración with permite que objetos como archivos sean
usados de una forma que asegure que siempre se los libera rápido y en forma correcta.:
with open("miarchivo.txt") as f:
for linea in f:
print(linea, end="")
Luego de que la declaración sea ejecutada, el archivo f siempre es cerrado, incluso si se encuentra un
problema al procesar las líneas. Objetos que, como los archivos, provean acciones de limpieza
predefinidas lo indicarán en su documentación.
include <stdio.h>
imt main()
{
int a, b;
a = 4;
b = a * 6;
printf( "%d", b )
retunr 0;
}
Una vez corregidos los errores de sintaxis en el código fuente de un programa, se debe revisar que
no se puede producir ningún error en la ejecución del mismo. Un error de ejecución se produce
cuando el ordenador no puede ejecutar alguna instrucción de forma correcta.
Ejemplo: En el programa:
#include <stdio.h>
int main()
{
int a;
float b;
a = 0;
b = 6.4 / a;
printf( "%f", b );
return 0;
}
6.4 / a
Los errores de lógica son los más difíciles de detectar. Cuando un programa no tiene errores de
sintaxis ni de ejecución, pero, aún así, no funciona bien, esto es debido a la existencia de algún
error lógico. De manera que, un error de lógica se produce cuando los resultados obtenidos no son
los esperados.
int main()
{
float base, altura;
base = 6.3;
altura = 4.;
return 0;
Por consiguiente, existe algún error lógico que hay que corregir. El error está en la expresión:
base * altura / 3
que, aunque no es incorrecta, no sirve para calcular el área de un triángulo. En su lugar se debe
escribir:
base * altura / 2
Los errores de compilación normalmente inhiben que el código fuente derive en un programa ejecutable,
mientras que los errores en tiempo de ejecución son situaciones específicas en las que un evento externo
al programa impide su ejecución. Regularmente un programador eficiente debe intentar imaginar como
debe responder ante esos eventos de manera que sea el programa y no el usuario o el sistema operativo
los que resuelvan el problema. Así por ejemplo un bloque de error no manejado podría hacer lo siguiente: