quarta-feira, 15 de maio de 2013

Entendendo exatamente Throw / Catch

Postado por DoctorRu (Will)

Um dos problemas com tutorais na web é que muitos são apenas copias traduzidas do manual sem nenhuma explicação pessoal do plagiador.

Se quem le não entendeu o exemplo, boa sorte na jornada, por isso resolvi explicar com mais detalhes o funcionamento do desvio throw / catch, eu mesmo demorei para entender o porque do throw estar localizado em alguns exemplos dentro do catch, agora explicando melhor:


A idéia de um throw aninhado dentro de um catch funciona assim:

Execute  o bloco de código abaixo até encontrar um throw, ao encontra-lo pare de executar o bloco de código e continue executando o que estiver na sequência.

O que dificulta o entendimento inicial de de throw / catch é que a tradução desses dois comandos equivale a "Jogue" / "Pegue" o que da a impressão de que o controle do código será transferido para o bloco catch quando o que realmente acontece é "um Jogue para fora de" / "Isto aqui" fazendo com que o controle saia do bloco catch.
# encoding:UTF-8
y = 0

catch(:prematuro) do

  while y < 10
    puts y  += 1
    throw :prematuro if y == 5
  end

  puts "Essa linha não será executada"

end

puts "O 'throw:prematuro' fez com que o bloco iniciado por catch fosse finalizado"
Equivale exatamente a:
y = 0
while y < 10
  puts y  += 1
  y = 10 if y == 5
end
throw / catch podem ser utilizados entre métodos diferentes, neste caso quando o throw for acionado ele voltará recursivamente até encontrar o catch, imagine que você está em uma trilha e para continuar você deve entrar em uma caverna para chegar do outro lado da trilha, então você vai descendo cada vez mais, passando por níveis mais profundos, ao acionar o throw você seria automaticamente teleportado para o lado de fora da caverna, como se ja a tivesse atravessado, mesmo que restassem mais níveis.
# encoding:UTF-8
def level_1
  puts "Entrando no level 1"
  catch(:caverna) do
    level_2
  end
  puts "throw! niveis 1-4! Saindo da caverna sem atingir o level 5"
end

def level_2
  puts "Entrando no level 2"
  level_3
end

def level_3
  puts "Entrando no level 3"
  level_4
end

def level_4
  puts "Entrando no level 4"
  throw :caverna
  level_5
end

def level_5
  puts "Este level não será atingido"
end

level_1
Produz:
Entrando no level 1
Entrando no level 2
Entrando no level 3
Entrando no level 4
throw! niveis 1-4! Saindo da caverna sem atingir o level 5
Este post foi escrito ao som de [OST] Ace Combat Zero - Zero

0 comentários :

Postar um comentário