Try-Catch trabalha sem interferir no fluxo. Dizer que é "mais profissional" ou que é "um substituto ao IF" são equívocos.
Cada um tem seu lugar e ocasião corretas para uso.
Um bloco IF-ELSE está presente no fluxo do programa, faz parte do seu algoritmo, uma exceção, como o próprio nome já diz é reservada para algo imprevisto.
Ainda, o lançamento de uma exceção - quase sempre - consiste em uma verificação prévia através de IF.
O tratamento de erros é melhor operado com try-catch, como já mencionado pelo Henrique, devido à pilha de execução.
Quando trabalhamos com funções,
sempre conhecemos seu retorno. Se isso não é verdadeiro, há um problema de arquitetura do sistema.
Uma vez que o retorno é conhecido, precisamos de um escape para comportamentos inesperados:
FUNÇÃO: DIVISÃO ( NÚMERO: DIVIDENDO, NÚMERO: DIVISOR ) -> NÚMERO: QUOCIENTE
Temos que, uma função, chamada
divisão recebe dois argumentos:
- Um numeral, chamado dividendo
- Um numeral, chamado divisor
E retorna um numeral.
Porém, como todos sabemos, a divisão possui uma exceção: quando o divisor é zero.
A primeira solução que poderíamos tomar é alterar o formato de retorno da função para devolver um mapa, oferecendo um identificador de erros e/ou o resultado:
FUNÇÃO: DIVISÃO ( NÚMERO: DIVIDENDO, NÚMERO: DIVISOR ) -> LISTA: [ INTEIRO: COD_ERRO, NÚMERO: QUOCIENTE ]
Percebe que, seguindo este raciocínio, TODAS as funções existentes no planeta </hipérbole> deveriam oferecer esse tipo de retorno?
Com algum raciocínio, observamos que esse comportamento é, obviamente, incorreto. Deve haver alguma outra forma da função lançar erros.
FUNÇÃO: DIVISÃO ( NÚMERO: DIVIDENDO, NÚMERO: DIVISOR ) -> NÚMERO: QUOCIENTE
SE DIVISOR NÃO É 0 ENTÃO RETORNE DIVIDENDO / DIVISOR
LANCE ERRO "NÃO É POSSÍVEL DIVIDIR POR ZERO!"
FIM FUNÇÃOPara interromper o fluxo e impedir que falhas posteriores consequentes desta aconteçam, seria necessário lançar um erro fatal. Qualquer outro erro que prossiga com o fluxo acarretará em erros em série
NÚMERO: QUANTIDADE_ATUAL = 50
NÚMERO: QUANTIDADE_TOTAL = 0
NÚMERO: PERCENTAGEM = DIVISÃO ( QUANTIDADE_ATUAL, QUANTIDADE_TOTAL ) * 100 // Erro: Multiplicação de NULO por 100
Observamos que esta também não é a técnica mais adequada para tratamento de erros.
Catch oferece uma alternativa para pegar - a tradução literal de "catch" - e retornar ao fluxo atual ou, em casos mais extremos, sair do fluxo de forma elegante.
FUNÇÃO: DIVISÃO ( NÚMERO: DIVIDENDO, NÚMERO: DIVISOR ) -> NÚMERO: QUOCIENTE
SE DIVISOR É 0 ENTÃO LANCE EXCEÇÃO: DIVISÃO_POR_ZERO
RETORNE DIVIDENDO / DIVISOR
FIM FUNÇÃOA primeira diferença que notamos é: na primeira abordagem poderíamos ter como retorno um NÚMERO ou um NULO. Na segunda abordagem,
sempre que houver um retorno ele será do tipo esperado.Dessa forma não encadeamos erros e, de quebra, ganhamos um manipulador para impedir erros consequentes:
NÚMERO: QUANTIDADE_ATUAL = 50
NÚMERO: QUANTIDADE_TOTAL = 0
TENTATIVA:
NÚMERO: PERCENTAGEM = DIVISÃO ( QUANTIDADE_ATUAL, QUANTIDADE_TOTAL ) * 100
EXCETO DIVISÃO_POR_ZERO:
NÚMERO: PERCENTAGEM = 0
FIM TENTATIVANa maioria das linguagens, há ainda outra vantagem: Manipulação por tipo de exceção
FUNÇÃO: DIVISÃO ( VARIÁVEL: DIVIDENDO, VARIÁVEL: DIVISOR ) -> NÚMERO: QUOCIENTE
SE (TIPO(DIVIDENDO) = NUMERAL) E (TIPO(DIVISOR) = NUMERAL) É FALSO ENTÃO
LANCE EXCEÇÃO: ARGUMENTO_INVÁLIDO
SE DIVISOR É 0 ENTÃO LANCE EXCEÇÃO: DIVISÃO_POR_ZERO
RETORNE DIVIDENDO / DIVISOR
FIM FUNÇÃO
VARIÁVEL: QUANTIDADE_ATUAL = [ENTRADA_DO_USUÁRIO]
VARIÁVEL: QUANTIDADE_TOTAL = [ENTRADA_DO_USUÁRIO]
TENTATIVA:
NÚMERO: PERCENTAGEM = DIVISÃO ( QUANTIDADE_ATUAL, QUANTIDADE_TOTAL ) * 100
EXCETO ARGUMENTO_INVÁLIDO:
IMPRIMA "POR FAVOR, INFORME DOIS NÚMEROS"
PARE
EXCETO DIVISÃO_POR_ZERO:
NÚMERO: PERCENTAGEM = 0
FIM TENTATIVAComo bem observado pelo Henrique, há ainda a possibilidade de empilhar tentativas e, conforme o tipo de exceção, tratar no local adequado, fugindo apenas do fluxo que será impossível atender:
FUNÇÃO: DIVISÃO ( VARIÁVEL: DIVIDENDO, VARIÁVEL: DIVISOR ) -> NÚMERO: QUOCIENTE
SE (TIPO(DIVIDENDO) = NUMERAL) E (TIPO(DIVISOR) = NUMERAL) É FALSO ENTÃO
LANCE EXCEÇÃO: ARGUMENTO_INVÁLIDO
SE DIVISOR É 0 ENTÃO LANCE EXCEÇÃO: DIVISÃO_POR_ZERO
RETORNE DIVIDENDO / DIVISOR
FIM FUNÇÃO
TENTATIVA:
VARIÁVEL: QUANTIDADE_ATUAL = [ENTRADA_DO_USUÁRIO]
VARIÁVEL: QUANTIDADE_TOTAL = [ENTRADA_DO_USUÁRIO]
TENTATIVA:
NÚMERO: PERCENTAGEM = DIVISÃO ( QUANTIDADE_ATUAL, QUANTIDADE_TOTAL ) * 100
EXCETO DIVISÃO_POR_ZERO:
NÚMERO: PERCENTAGEM = 0
FIM TENTATIVA
EXCETO ARGUMENTO_INVÁLIDO:
IMPRIMA "POR FAVOR, INFORME DOIS NÚMEROS"
PARE
FIM TENTATIVAObserve que no último exemplo, como não será possível continuar sem definir o valor de PERCENTAGEM, o tratamento dessa exceção fica um nível acima do escopo onde a variável é necessária.