Ttulo
Manipulao de Erros e Excees
Disciplina
Tcnicas de Programao
Professor
Jos Eustquio Rangel de Queiroz
rangel@dsc.ufcg.edu.br, rangeldequeiroz@gmail.com
Equipe
Daniel Ribeiro do Carmo Filho
Danilo Gomes de Andrade
Lucas Farias Martins
Rogerio Moreira Almeida
Campina Grande PB
Maro de 2017
_____________________________
Jos Eustquio Rangel de Queiroz
Professor
_____________________________
Daniel Ribeiro do Carmo Filho
_____________________________
Danilo Gomes de Andrade
_____________________________
Lucas Farias Martins
_____________________________
Rogerio Moreira Almeida
Equipe
SUMRIO
1 Introduo ...................................................................................... 4
2 Objetivos ...................................................................................... 5
Anexos ...................................................................................... 15
Apndices ...................................................................................... 19
4
1 Introduo
Neste relatrio ser apresentado e discutido o tema "Manipulao de Erros e
Excees" visando melhoria dos programas desenvolvidos na linguagem de
programao C++. Dessa forma, ser possvel criar programas evitando ou
contornando erros inesperados, bem como avisar que h algo errado e que
medidas corretas devem ser executadas. Esses detalhes tornam os programas
mais bem preparados e desenvolvidos que outros, satisfazendo melhor as
exigncias do mercado.
Elaborao do documento:
i. Introduo nesta seo so descritos os interesses e a importncia do
tema;
ii. Objetivos na segunda seo sero apresentados os objetivos especficos
e geral deste relatrio;
iii. Fundamentao Terica na terceira seo ser desenvolvida uma
explicao do tema;
iv. Consideraes Finais na quarta seo sero apresentadas as concluses
obtidas da pesquisa;
v. Referncia Bibliogrfica nessa seo esto listadas as fontes da pesquisa;
vi. Anexos nessa seo esto os cdigos de outros autores adaptados;
vii. Apndices nessa seo esto os cdigos elaborados pelo autor.
importante notar que o uso de equipamentos e aplicativos criados pelo
ser humano est cada vez mais intrnseco vida atual. Eles so utilizados
diariamente para facilitar e possibilitar a realizao de diversas atividades, como
numa empresa armazenando dados ou num avio voando. Alm de entreter com
jogos, eles esto presentes desde uma lmpada que ilumina a casa, at um satlite
que envia e recebe sinais constantemente.
flagrante, outrossim, que muitas vezes a vida de pessoas e o
funcionamento de empresas dependem da eficincia e boa execuo desses
equipamentos e aplicativos, quando erros so, no apenas inconvenientes, mas
inadmissveis. Por isso so feitos diversos testes e prevenes para evitar
tragdias como a que ocorreu em Alcntara no lanamento de um foguete, quando
21 pessoas pereceram devido a um acidente.
Deve-se a esses fatos uma das maiores importncias do tratamento de
erros e excees, ele no apenas deixa o programa mais elegante, como tambm
o deixa mais independente a eventos condicionados pelo usurio e indesejveis ao
5
2 Objetivos
A pesquisa ora documentada tem como objetivo geral trazer conhecimentos acerca
da Manipulao de Erros e Excees, esclarecendo sua funcionalidade e uso e
garantindo que se evitem eventos os quais possam ocasionar prejuzos ou
desastres. Dentre os objetivos especficos da referida pesquisa podem ser citados:
i. Expor o contedo de forma simples e acessvel;
ii. Descrever como funcionam os cdigos da manipulao de erros e excees
em C++;
iii. Exibir exemplos e aplicaes.
3 Fundamentao Terica
As linguagens de programao mais atuais j possuem mecanismos para evitar
problemas causados por eventos inesperados. No diferente para o C++, cujos
recursos podem ser utilizados para contornar uma situao que traria problemas.
Inicialmente sero apresentados os conceitos bsicos de Manipulao de Erros e
Excees e, ento, adentrar-se- mais no tema.
Ao iniciar uma funo com um valor que foge regra dela ocorre um
resultado inesperado, como o exemplo no Apndice A Fatorial Negativo, nada se
pode afirmar quanto a que ser exibido durante a execuo do programa visto que
no existe fatorial de nmero negativo, mas pode se utilizar os comandos try,
throw e catch para evitar que essa exceo ocorra. Para compreender tudo
corretamente, necessrio, preliminarmente, saber de alguns detalhes os quais
sero explicados a seguir.
3.2.1 DESEMPILHAMENTO
Com o fluxo do programa, ocorre o empilhamento de blocos e funes, mas quando
uma exceo lanada, o processo de desempilhamento iniciado. Dessa forma,
o escopo atual finalizado, se ele for um bloco try{}, busca um catch(){}
correspondente, se no encontrar ou no for um bloco try{}, o desempilhamento
reiniciado.
Ao executar o cdigo do Apndice C Desempilhamento possvel
perceber o caminho do programa, desde o empilhamento ao desempilhamento.
3.2.2 FUNCIONAMENTO
importante saber que, de acordo com Deitel (2005), se uma exceo ocorrer,
ela lanada e o bloco try{} finalizado, ento as excees procuram um
catch(){} pela ordem de cima para baixo e do try{} mais interno para o mais
externo (desempilhamento), comparando o tipo de exceo lanado com o tipo de
parmetro de exceo dos blocos catch(){}, ocorre a correspondncia se os tipos
forem idnticos ou se o tipo lanado for de uma classe derivada do tipo do
parmetro, contudo, caso nenhum catch(){} capture a exceo, a funo
unexpected() chamada.
Alm disso, vale ressaltar que o programa no retorna ao ponto em que a
exceo ocorreu, mas se excees no ocorrerem no bloco try{}, seus blocos
catch(){} sero ignorados.
Dessa forma, voltando ao problema inicial do fatorial de um nmero
negativo, pode-se, ento, construir um programa mais robusto que exibe uma
8
Diagrama 2 throw
necessrio perceber que cada uma tem sua forma e objetivo, desse
modo, ambas tm sua importncia de acordo o resultado desejado. J que o return
pode ser utilizado sempre que quiser retornar algo para a funo que o chamou e
o throw sempre que quiser lanar uma exceo para o respectivo catch(){},
percebemos que o segundo ideal para a manipulao de erros e excees.
Observe que no Apndice E throw x return mostra a diferena aplicada
entre o throw e o return e ser exibido o fluxo do programa: Entrando em func1,
9
exception
runtime_error logic_error
3.4.2 DO PROGRAMADOR
evidente a mirade de classes existentes na biblioteca padro para auxiliar no
11
dados.
Observe no Apndice I Excees de Entrada que quando um inteiro for
inserido, o programa continuar normalmente, mas, caso algo diferente seja
inserido, uma exceo lanada, e o programa, finalizado.
4 Consideraes Finais
Referncias Bibliogrficas
LISCHNER, Ray. Exploration 43: Exceptions. In:_____. Exploring C++: The
Programmer's Introduction to C++. United States of America: Apress, 2009.
p.357-371.
SAVITCH, Walter. Exception Handling. In:_____. Absolute C++, 5th Ed. United
States of America: Addison-Wesley, 2013. p.825-855.
int main()
{
S* p = NULL;
try {
std::cout << typeid(*p).name() << '\n';
} catch(const std::bad_typeid& e) {
std::cout << e.what() << ' ';
}
Foo b;
try {
S& d = dynamic_cast<S&>(b);
} catch(const std::bad_cast& e)
{
std::cout << e.what() << ' ';
}
try{
int* myarray= new int[100000000000000000000];
} catch (std::bad_alloc& ba)
{
std::cerr << ba.what() << ' ';
}
std::vector<int> myvector(10);
try {
myvector.at(20)=100; // vector::at throws an out-of-range
}
16
try {
// bitset constructor throws an invalid_argument if initialized
// with a string containing characters other than 0 and 1
std::bitset<5> mybitset (std::string("01234"));
}
catch (const std::invalid_argument& ia) {
std::cerr << ia.what() << ' ';
}
}
17
int main () {
std::exception_ptr ptr;
try {
throw std::logic_error("excecao de logica"); // throws
} catch(const std::exception& e) {
ptr = std::current_exception();
std::cout << "excecao capturada, mas continuando...\n";
}
try {
std::rethrow_exception (ptr);
} catch (const std::exception& e) {
std::cout << "excecao capturada: " << e.what() << '\n';
18
auto p = std::make_exception_ptr(std::logic_error("logic_error"));
try {
std::rethrow_exception (p);
} catch (const std::exception& e) {
std::cout << "excecao capturada: " << e.what() << '\n';
}
try {
throw_nested();
} catch (std::exception& e) {
print_what(e);
}
return 0;
}
19
return 0;
}
20
return 0;
}
21
Apndice C Desempilhamento
//Exemplo 08 - O desempilhamento
#include <iostream>
#include <exception> //std::exception
void funcao_1();
void funcao_2();
int main(){
try{
cout << "Primeiro bloco try{}" << endl;
try{
cout << "Segundo bloco try{}" << endl;
funcao_1();
}catch(int &x){
}catch(double &y){
}catch(...){
return 0;
}
void funcao_1(){
funcao_2();
void funcao_2(){
throw exception();
return 0;
}
24
void nova_un(){
cout << "Na nova unexpected, ";
throw;
}
void nova_ter(){
cout << "Na nova terminate, ";
}
void func()throw(bad_exception){
throw 1;
}
void func2()throw(int,char){
throw 1;
}
void func1()throw(){
throw 1;
}
try{
func();
}catch(int){
cout << "int capturado, ";
}catch(bad_exception){
cout << "bad_exception capturado, ";
}
try{
func1();
27
}catch(int){
cout << "int capturado, ";
}catch(bad_exception){
cout << "bad_exception capturado, ";
}
try{
func2();
}catch(int){
cout << "int capturado, ";
}catch(bad_exception){
cout << "bad_exception capturado, ";
}
return 0;
}
28
class nova{
int n;
public:
nova(int n){
this-> n = n;
cout << "Criando nova: " << n << ", ";
}
~nova(){cout << "Destruindo nova: " << n << ", ";}
};
int main(){
try{
nova n(1);
throw "opa";
}catch(...){cout << "Excecao capturada, ";}
try{
nova * d = new nova(2);
throw "opa";
delete d;
}catch(...){cout << "Excecao capturada, ";}
try{
auto_ptr<nova> m(new nova(3));
throw "opa";
}catch(...){cout << "Excecao capturada, ";}
}
29
int i;
try{
while(2){
//o programa pede a entrada de um inteiro
cout << "Digite um inteiro" << endl;
cin >> i;
cout << i << endl << endl;
//caso seja inserido um tipo diferente de inteiro
//uma exceo do tipo ios_base::failure lanada
}
}
catch(ios_base::failure &erro){
cout << "Erro: Entrada incorreta: " << erro.what();
fflush(stdin);
}
return 0;
}