Coletânea Python do ZERO às Redes Neurais Artificiais
Try, Except
Uma das boas práticas de programação é, no desenvolvimento de uma
determinada aplicação, tentar na medida do possível prever todas as situações onde o usuário pode querer fazer o uso inadequado de uma funcionalidade, gerando um erro.
Você certamente já utilizou de softwares que ao tentar realizar uma
determinada ação simplesmente deixavam de funcionar, e isso ocorre porque aquela situação não foi prevista pelo desenvolvedor.
Retomando nossa linha de raciocínio, independente da complexidade de
nosso programa, devemos nos colocar no lugar do usuário e tenra por a prova todas as possíveis situações adversas que podem gerar erros de execução de nosso programa.
Internamente, no âmbito de nosso código, as chamadas exceções devem
ser tratadas de modo que de nenhuma forma seja interrompida a execução de um código, e isto é feito via Try e Except.
Certamente se você chegou a este ponto, deve dominar ao menos a
lógica de estruturas condicionais. Lembrando que por meio de estruturas de código como if, elifs e elses, criamos condições que somente ao serem alcançadas um determinado bloco de código era executado.
Não muito diferente disso teremos as estruturas de Try e Except, pois
aqui criaremos estruturas de validação onde caso uma exceção ocorra, haverá um meio alternativo de tentar executar a respectiva funcionalidade sem que pare a execução de nosso programa.
Começando do início, a sintaxe básica deste tipo de estrutura de dados
validadora se dá como apresentado acima e pode ser incorporado em qualquer outra estrutura de código.
A estrutura mais básica deste tipo de validador será sempre algo que o
interpretador tentará executar indentado a try, onde caso o mesmo não consiga executar tal bloco de código, deverá executar o que está indentado para except.
Como dito anteriormente, esta estrutura se assemelha muito com as já
conhecidas estruturas condicionais, inclusive é perfeitamente possível criar estruturas de validação por meio de estruturas condicionais.
A grande diferença se dá que aqui nesse contexto, uma exceção será gerada pela tentativa não bem sucedida de executar um determinado bloco de código, o que faria nosso programa parar de funcionar.
Enquanto nas estruturas condicionais simplesmente se tal condição não fosse alcançada seria ignorada pelo interpretador.
Voltando ao exemplo, repare que em try estamos tentando exibir o
conteúdo de uma variável de nome a, essa variável por si só não existe aqui nesse exemplo, logo, se essa linha de código estivesse no corpo de nosso programa, ao tentar executar o mesmo teríamos um erro.
Aqui, nesse contexto, por não ser possível executar o comando
indentado para try, o interpretador simplesmente fará a execução do que estiver indentado em except, nesse caso, uma mensagem de erro já definida pelo desenvolvedor.
Uma vez que contornamos a questão de nosso programa parar de
funcionar em decorrência de um erro, algo bastante comum é definirmos uma espécie de erro genérico, onde para o usuário será exibida uma mensagem de erro, e para o desenvolvedor será exibido via console qual foi o erro gerado para que possa ser trabalhado para correção do mesmo.
Por meio da palavra reservada ao sistema Exception, podemos realizar
tal tipo de inspeção em nosso erro.
Enquanto o usuário recebe a mensagem “Ocorreu um erro inesperado”, o
desenvolvedor em seu terminal tem uma resposta mais objetiva. Nesse caso, o log nos mostra que, como esperado, o erro se dá em função de que a variável a não existe, não existe o nome “a” atribuído a nada no código.
O mesmo pode ser feito com outros tipos de identificadores de erro, na
imagem acima, por meio de NameError teríamos, independente do tipo de erro, o nome do erro em si.
Apenas concluindo essa linha de raciocínio, você pode via Exception
gerar um erro genérico, sem problema, assim como você pode usar de alguns identificadores para obter um log de erro mais específico.
Por exemplo usando de MemoryError nos é retornado qual objeto
alocado em memória está gerando a exceção, podendo assim encontrar o mesmo no corpo do código e tratar o erro.
Outros identificadores como ValueError, KeyboardInterrupt, SystemExit, etc… podem ser encontrados na documentação do Python.
Simulando uma aplicação real, vamos criar uma estrutura de validação via try e except. Supondo que estamos a criar uma função que simplesmente tenta converter um número a ser repassado pelo usuário.
Sendo assim criamos a função conversor_num( ) que receberá um
número como parâmetro, dentro do corpo desse bloco de código criamos a primeira fase de validação onde via try, o interpretador tentará converter o número repassado para int, se isso for possível, retornará o próprio número.
Na sequência, caso esta primeira “condição” não seja alcançada, o
interpretador tentará agora converter este número para float.
Caso nenhuma das tentativas seja bem sucedida, o interpretador
simplesmente irá ignorar a execução dessa função. Poderíamos aqui, neste último except, perfeitamente criar uma mensagem de erro ao usuário informando o mesmo que não foi possível converter o dado repassado pelo mesmo.
Note também que a estrutura de validação em si está toda construída dentro da função.
Seguindo o código, é criada uma variável de nome num1 que chama a
função conversor_num( ) pedindo para que o usuário digite um número.
Em seguida é criada uma estrutura condicional onde se o valor atribuído
a num1 não for None, é exibida a soma daquele número já validado pela função por 100. Caso contrário, é exibida a mensagem de erro.
Raciocine que, por exemplo o usuário digitasse qualquer caractere
diferente de um número, o validador construído em nossa função conversor_num( ) faria suas tentativas de conversão, não conseguindo, não iria retornar nada. Dessa forma, na estrutura condicional criada fora da função, o dado/valor atribuído para num1 seria None.