O TEMA DO FÓRUM ESTÁ EM MANUTENÇÃO. FEEDBACKS AQUI: ACESSAR

[Ruby] Aula 9 - Try & Catch

Iniciado por Raizen, 01/08/2014 às 15:13

01/08/2014 às 15:13 Última edição: 16/12/2015 às 10:29 por Raizen
[box class=windowbg1]
Índice das aulas básicas
  • Aula 1 - Introdução
  • Aula 2 - Objetos
  • Aula 3 - Operações
  • Aula 4 - Condições
  • Aula 5 - Repetição
  • Aula 6 - Arrays
  • Aula 7 - Hashes
    [/box]
    [box class=windowbg1]
    Índice das aulas avançadas
  • Aula 8 - Superclasses e instâncias
    [/box]
    [box class=windowbg1]
    Índice das aulas de algoritmos
  • Aula 1 - Sort
  • Aula 2 - Busca
  • Aula 3 - Recursividade
    [/box]

    [box class=windowbg]
    Try and Catch
    [/box]
    Conhecimento necessário : médio
    [box class=windowbg]
    Introdução
    [/box]
    [box class=windowbg2]
    Bom, essa é a nona aula, e ela já começa a tratar de assuntos mais avançados sobre a programação, por isso ela requer que saiba boa parte das aulas anteriores.

    A aula atual é o famoso "try and catch", o "try and catch" é um tratamento em relação a erros no programa, ou seja ele é especificamente feito visando o contorno ao erro que será gerado. Como sabem, a essa altura já devem ter programado alguma coisa em Ruby ou outra linguagem, e várias vezes devem ter se deparado aos erros, e não digo erros de sintaxe, e sim erros de objetos, métodos, ou erros de lógica que o programa executa. Um exemplo bem clássico:
    Uma variável a tem valor 5, a variável b tem valor 0, e o seu código divide a por b.
    a/b
    Nesse momento o seu programa "explode", pois a divisão de algo por 0 é impossível, assim fechando toda a execução dele. Nesse caso pode ser contornado? Pode, mas esse é um exemplo bem simples, muitas vezes temos o famoso stack error, e outros problemas que são muito complicadas e demoradas tentar contornar esses erros. Nesse momento entra o try and catch, como diz o nome, ele "tenta" executar, e caso não consiga ele captura algo diferente, um pouco semelhante ao if e else.
    [/box]

    [box class=windowbg]
    No Ruby
    [/box]
    [box class=windowbg2]
       No Ruby a escrita difere das linguagens mais usuais como C# por exemplo, ao invés de try, catch e finally, no Ruby temos begin, rescue e ensure, mas que tem o mesmo principio.
    Vamos a programação :)
    Escreva o seguinte código.
    a = 5
    b = 0
    p a/b
    


    E como esperado terá o erro e o fechamento do programa, dizendo que não se pode dividir por 0.

    mas apresentamos a estrutura do begin rescue e ensure.
    begin
        # Aqui seu código de teste
        rescue
        # Aqui o código caso o teste falhe
        ensure
        # Aqui o código que sempre será executado, independente se falhar um ter sucesso
    end
    


    Então colocando nossa divisão por 0

    begin
        a = 5
        b = 0
        p a/b # sua divisão por 0, Esse código não irá executar
        rescue
        p "Não dividirás por zero"
        ensure
        p "Fim do código"
    end
    


    Ou seja, o seu código deixa de executar, pois ele gera um erro, esse erro fica gravado na variável global $! ou seja você pode também saber o que causou o erro, desse modo.
    begin
        a = 5
        b = 0
        p a/b # sua divisão por 0
        rescue
        @error_message="#{$!}"
        p @error_message
        ensure
        p "Fim do código"
    end
    

    claro que se mudar a variável e se tornar um código executável, o que será executado vai ser o código e não o que está dentro do bloco rescue, por exemplo.
    begin
        a = 5
        b = 1
        p a/b # sua divisão pode ocorrer
        rescue
        @error_message="#{$!}" # Esse bloco não será executado
        p @error_message 
        ensure
        p "Fim do código"
    end
    

    [/box]

    [box class=windowbg]
    Finalizando
    [/box]
    [box class=windowbg2]
      Esse é um bloco muito utilizado em tratamento de erros e em casos cujo se torne mais fácil tentar e capturar do que um modo a dar a volta pelo código para que não ocorra o erro. O tratamento de erro nada mais seria do que buscar o erro no programa e ai então sabendo do erro buscar um modo de resolve-lo, mas sem atrapalhar a execução restante do programa. Dito isso então tem 2 usos muito importantes na programação, e agora chegamos ao fim dessa aula, em breve mais novas aulas :)
    [/box]

Excelente aula de como utilizar a expressão begin/rescue/ensure/end, mas acho que o nome do tópico um pouco inadequado pois pode confundir as pessoas (como eu) achando que era sobre catch/throw. Também acho que poderia explicar pro pessoal sobre o raise que pode ser usado nessa expressão, no mais excelente aula.

Citação de: Azraven online 01/08/2014 às 16:22
Excelente aula de como utilizar a expressão begin/rescue/ensure/end, mas acho que o nome do tópico um pouco inadequado pois pode confundir as pessoas (como eu) achando que era sobre catch/throw. Também acho que poderia explicar pro pessoal sobre o raise que pode ser usado nessa expressão, no mais excelente aula.
AH pods crer, alias era bom eu colocar tudo isso nessa aula, vou dar uma modificada e implementar a aula um pouco xD, eu ia fazer isso mas acabei mandando assim, vlws manolo você é o cara :D