Exceções C++


Exceções C++

Ao executar o código C++, diferentes erros podem ocorrer: erros de codificação feitos pelo programador, erros devido a entrada errada ou outros imprevistos.

Quando ocorre um erro, o C++ normalmente para e gera uma mensagem de erro. O termo técnico para isso é: C++ lançará uma exceção (lançará um erro).


C++ tente e pegue

O tratamento de exceções em C++ consiste em três palavras-chave: try, throwe catch:

A tryinstrução permite que você defina um bloco de código para ser testado quanto a erros enquanto está sendo executado.

A throwpalavra-chave lança uma exceção quando um problema é detectado, o que nos permite criar um erro personalizado.

A catchinstrução permite definir um bloco de código a ser executado, caso ocorra um erro no bloco try.

As palavras-chave trye catchvêm em pares:

Exemplo

try {
  // Block of code to try
  throw exception; // Throw an exception when a problem arise
}
catch () {
  // Block of code to handle errors
}

Considere o seguinte exemplo:

Exemplo

try {
  int age = 15;
  if (age >= 18) {
    cout << "Access granted - you are old enough.";
  } else {
    throw (age);
  }
}
catch (int myNum) {
  cout << "Access denied - You must be at least 18 years old.\n";
  cout << "Age is: " << myNum;
}

Exemplo explicado

Usamos o trybloco para testar algum código: Se a agevariável for menor que 18, faremos throwuma exceção e trataremos em nosso catchbloco.

No catchbloco, pegamos o erro e fazemos algo a respeito. A catch instrução recebe um parâmetro : em nosso exemplo, usamos uma intvariável ( myNum) (porque estamos lançando uma exceção de inttipo no trybloco ( age)), para gerar o valor de age.

Se nenhum erro ocorrer (por exemplo, if ageis 20em vez de 15, significando que será maior que 18), o catchbloco será ignorado:

Exemplo

int age = 20;

Você também pode usar a throwpalavra-chave para gerar um número de referência, como um número/código de erro personalizado para fins de organização:

Exemplo

try {
  int age = 15;
  if (age >= 18) {
    cout << "Access granted - you are old enough.";
  } else {
    throw 505;
  }
}
catch (int myNum) {
  cout << "Access denied - You must be at least 18 years old.\n";
  cout << "Error number: " << myNum;
}

Lidar com qualquer tipo de exceção (...)

Caso você não saiba o throw tipo usado no trybloco, você pode usar a sintaxe dos "três pontos" ( ...) dentro do catchbloco, que tratará qualquer tipo de exceção:

Exemplo

try {
  int age = 15;
  if (age >= 18) {
    cout << "Access granted - you are old enough.";
  } else {
    throw 505;
  }
}
catch (...) {
  cout << "Access denied - You must be at least 18 years old.\n";
}