Melhor resposta
Existem duas definições possíveis:
Em termos gerais ,
Um erro em tempo de execução é uma operação inválida que ocorre durante a execução de um programa que não pode ser detectado em tempo de compilação.
Por exemplo, considere isso
#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 é “bem formado”: o compilador pode traduzi-lo com sucesso e o sistema operacional o executa com êxito.
E se você digitar dois inteiros separados por espaço quando necessário, ele imprime o quociente integral como deveria.
Mas, se você digitar “0” como um segundo número, ou se você digitar algo como qualquer coisa que t não é um número ou não pode ser analisado como um número, você vai acabar com uma divisão inteira por 0. Algo que a CPU não pode fazer e para o qual um sinal de interrupção é emitido esperando que algo reaja a isso. (A reação padrão do sistema operacional é passar o sinal para o programa, onde o manipulador de sinal padrão CRT chama “terminate ()”.
Em C ++ específico termo : um erro de tempo de execução é qualquer instância de qualquer classe derivada de std::runtime\_error
dada a uma instrução throw
.
Qualquer função que descubra uma operação que não pode ser concluída conforme o esperado deve lançar uma exceção como essa, para permitir que o chamador gerencie o erro.
Agora, vamos tentar ser mais “gentis”:
#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);
}
}
}
Você pode veja a função div
realmente fazendo a divisão. Ele pode filtrar o caso do divisor “0”, mas não pode corrigir por si mesmo o problema (ele não tem ideia sobre “por que” o divisor é 0, então não pode realizar nenhuma ação específica: ele “relata” sua falha na forma de um exceção.
O main
anterior está agora dentro de um bloco try
. Se nenhuma exceção for lançada, ele se comporta como o anterior.
Se uma exceção for lançada, o escopo é encerrado, mas o bloco catch irá imprimir uma mensagem informativa, limpar a "entrada incorreta" (ele redefine os sinalizadores de estado - portanto remover qualquer fail
bit no cin
estado, do que ignorar os “caracteres burros” até um ponto razoável - o próximo \ n) e deixe o loop de agrupamento ser executado novamente.
Resposta
Erros de tempo de execução são erros que ocorrem quando o programa está sendo executado. Eles podem ser de tipos diferentes, incluindo:
- Erros lógicos: quando o programa gera uma saída diferente da saída esperada. Por exemplo - você faz um programa para somar dois números, mas por engano dá um sinal - em vez do sinal +.
- Vazamentos de memória: O programa usa RAM continuamente e evita que os locais da memória sejam utilizados para outras tarefas uma vez seu trabalho está terminado. Executar loops infinitos ou não desalocar a memória usada pode causá-los.
- Falhas: podem ser devido a muitos motivos como:
- Referenciar arquivos ausentes. Você deseja exibir uma imagem, mas fornecer o caminho errado para ela; o programa não a encontrará e travará.
- Dividindo as coisas por zero Dizemos simplesmente que qualquer coisa dividida por 0 não está definida. Os programas não são tão inteligentes e enlouquecem.
- Fornecendo a opinião errada. Já tentou inserir um caractere em uma variável inteira durante a execução do programa? Se sim, você sabe o que acontece.etc.
Espero que tenha ajudado…