Mejor respuesta
Hay dos definiciones posibles:
En términos generales ,
Un error en tiempo de ejecución es una operación no válida que ocurre durante la ejecución de un programa que en tiempo de compilación no se puede detectar.
Por ejemplo, considere esto
#incude
int main()
{
int a=0, b=0;
std::cout << "getting the quotient. \n Two numbers, please" << std::endl;
std::cin >> a >> b;
auto z = a/b;
std::cout << "the quotient is" << z << std::endl;
}
Este programa está "bien formado": el compilador puede traducirlo correctamente y el sistema operativo lo ejecuta con éxito.
Y si escribe dos enteros separados por espacios cuando es necesario, imprime el cociente integral como se supone que debe hacerlo.
Pero, si escribe "0" como segundo número, o si escribe algo como lo que sea Si no es un número o no se puede analizar como un número, terminará con una división entera entre 0. Algo que la CPU no puede hacer y por lo que se emite una señal de interrupción esperando que algo reaccione. (La reacción estándar del sistema operativo es pasar la señal al programa, donde el controlador de señal predeterminado de CRT llama a “terminate ()”.
En C ++ específico term : un error en tiempo de ejecución es cualquier instancia de cualquier clase derivada de std::runtime\_error
dada a una throw
instrucción.
Cualquier función que descubra una operación que no se puede completar como se esperaba debería lanzar una excepción como esa, para permitir que la persona que llama maneje el error.
Ahora, intentemos ser más “suaves”:
#include
#include
#include
class divide\_by\_zero: public std::runtime\_error
{ public: using std::runtime\_error::runtime\_error; };
// filter a divide by zero runtime error
auto div(int a, int b)
{
if(!b)
{ throw divide\_by\_zero("attempt to divide by zero"); }
return a/b;
}
// clear a stream status, and discard input up to a "\n"
void discard\_input(std::istream& s)
{
s.clear();
s.ignore(std::numeric\_limits
}
int main()
{
for(;;)
{
try
{
int a=0; b=0;
std::cout << "Getting the quotient: Two numbers, please" << std::endl;
std::cin >> a >> b;
auto z = div(a,b);
std::cout << "The quotient is " << z << std::endl;
return 0;
}
catch(std::exception& e) //whatever exception
{
std::cout << "Error in computation: " << e.what() << "\n";
std::cout << "Bad input - retry!" << std::endl;
discard\_input(std::cin);
}
}
}
Puede vea la función div
que realmente hace la división. Puede filtrar el caso del divisor "0", pero no puede corregir el problema por sí mismo (no tiene ni idea de "por qué" el divisor es 0, por lo que no puede tomar ninguna acción específica: "informa" su falla en forma de un excepción.
La main
anterior, ahora está dentro de un bloque try
. Si no se lanzan excepciones, se comporta como el anterior.
Si se lanza una excepción, se sale del alcance, pero el bloque de captura imprimirá un mensaje informativo, limpiará la "entrada incorrecta" (restablece los indicadores de estado, por lo tanto eliminando cualquier fail
bit en cin
, luego ignore los "caracteres tontos" hasta un punto razonable - el siguiente \ n) y deje que el ciclo de envoltura se vuelva a ejecutar.
Respuesta
Los errores en tiempo de ejecución son errores que ocurren cuando el programa se está ejecutando. Pueden ser de diferentes tipos, que incluyen:
- Errores lógicos: cuando el programa genera una salida que es diferente de la salida esperada. Por ejemplo, crea un programa para sumar dos números pero, por error, da un signo - en lugar del signo +.
- Pérdidas de memoria: los programas utilizan continuamente RAM y evitan que las ubicaciones de la memoria se utilicen para otras tareas una vez. su trabajo está terminado. Ejecutar bucles infinitos o no desasignar la memoria usada puede causarlos.
- Bloqueos: Pueden deberse a muchas razones, como:
- Hacer referencia a archivos faltantes. Si desea mostrar una imagen, pero le proporciona la ruta incorrecta, el programa no la encontrará y se bloqueará.
- Dividiendo las cosas por cero. Simplemente decimos que cualquier cosa dividida por 0 no está definida. Los programas no son tan inteligentes y se vuelven locos.
- Da la entrada incorrecta. ¿Alguna vez intentó ingresar un carácter en una variable entera durante la ejecución del programa? Si es así, sabes lo que sucede.etc.
Espero que haya ayudado…