Rodrigo Lazoti Blog

Desenvolvimento de software e tecnologia em geral

Siga-me no Twitter!RSS Feeds

  • Início
  • iPhone Apps
  • Publicações
  • Downloads
  • Sobre o Autor
  • Contato

Exceptions em Ruby {Rescue, Retry e Ensure}

10/03/09

Escrito por Rodrigo Lazoti em Ruby

1 comentário

Ruby é uma linguagem que tem aparecido bastante e obtido um grande destaque no mundo do desenvolvimento de software por sua agilidade e simplicidade, assim como muitos desenvolvedores acabei estudando a linguagem por curiosidade e tenho gostado dos resultados.

Mas voltando ao foco do post, vou apresentar de uma forma resumida como a linguagem Ruby lida com o tratamento de exceptions utilizando os comandos Rescue, Retry e Ensure.

rescue: fornece uma forma de tratar uma exception lançada, ele é parecido com o catch do Java.

Exemplo de rescue:

begin
  eval algumaCoisaQueNaoExiste

rescue NameError => boom
  puts "variavel local ou metodo indefinido."
end

ensure: fornece uma forma de garantir que o código sempre irá rodar independente de uma exception ser lançada ou não. Parecido com o finally do Java.

Exemplo de ensure:

begin
  eval algumaCoisaQueNaoExiste

rescue NameError => boom
  puts "variavel local ou metodo indefinido."

ensure
  puts "fim do programa."
end

retry: este certamente é o comando mais interessante de todos, pois com ele podemos “dar uma segunda chance” para o método caso ocorra alguma exception.

Para exemplificar o retry vou criar uma classe com um unico metodo que tem por finalidade somar dois numeros positivos. Inicialmente não irei utilizar o retry para ver como o código irá se comportar.

class Calculator

  def sum_positive_numbers(first_number,  second_number)
  begin

    if first_number < 0 or second_number < 0
      raise ArgumentError, "The value can not be less than zero."
    else
      return "#{first_number} + #{second_number} = #{first_number + second_number}"
    end

    rescue ArgumentError => exception
      if first_number < 0
        puts "#{exception} Current Value = #{first_number}"
      end

      if second_number < 0
        puts "#{exception} Current Value = #{second_number}"
      end
    end

  end
end

Agora vamos testar o método e ver seu resultado

  calculator = Calculator.new
  puts calculator.sum_positive_numbers( 0, 0 )
  puts calculator.sum_positive_numbers( 5, 2 )
  puts calculator.sum_positive_numbers( -5, 2 )
  puts calculator.sum_positive_numbers( 5, -2 )
  puts calculator.sum_positive_numbers( -5, -2 )

Resultado:

0 + 0 = 0
5 + 2 = 7
The value can not be less than zero. Current Value = -5
nil
The value can not be less than zero. Current Value = -2
nil
The value can not be less than zero. Current Value = -5
The value can not be less than zero. Current Value = -2
nil

Agora vou fazer uma pequena alteração no método para caso algum de seus argumentos seja negativo, o mesmo receba o valor 0 e seja refeito o cálculo.

class Calculator

  def sum_positive_numbers(first_number,  second_number)
  begin

    if first_number < 0 or second_number < 0
      raise ArgumentError, "The value can not be less than zero."
    else
      return "#{first_number} + #{second_number} = #{first_number + second_number}"
    end

    rescue ArgumentError => exception

      if first_number < 0
        puts "#{exception} Current Value = #{first_number} | New Value 0"
        first_number = 0
      end

      if second_number < 0
        puts "#{exception} Current Value = #{second_number} | New Value 0"
        second_number = 0
      end

      #aqui eu peço para tentar novamente
      retry

    end
  end
end

Finalmente vamos testar no metodo utilizando o comando retry.

  calculator = Calculator.new
  puts calculator.sum_positive_numbers( 0, 0 )
  puts calculator.sum_positive_numbers( 5, 2 )
  puts calculator.sum_positive_numbers( -5, 2 )
  puts calculator.sum_positive_numbers( 5, -2 )
  puts calculator.sum_positive_numbers( -5, -2 )

O resultado será:

0 + 0 = 0
5 + 2 = 7
The value can not be less than zero. Current Value = -5 | New Value 0
0 + 2 = 2
The value can not be less than zero. Current Value = -2 | New Value 0
5 + 0 = 5
The value can not be less than zero. Current Value = -5 | New Value 0
The value can not be less than zero. Current Value = -2 | New Value 0
0 + 0 = 0

Um único problema é que se não tormar cuidado, podemos fazer o software entrar em um retry infinito. Para entender o que estou dizendo basta alterar umas das atribuições de valor 0, como por exemplo first_number = 0 para um valor negativo como first_number = -10. Rode o programa e veja o que acontece. :D

Com isso já deu para conhecer um pouco do que a linguagem Ruby é capaz! ;)

Ruby

Programas úteis para seu Mac OS X

05/03/09

Escrito por Rodrigo Lazoti em Mac OS X

3 comentários

Sou um grande defensor do Linux e usuário durante alguns anos, passando desde ubuntu até slackware, como já tinha abandonado meu windows mobile (HTC Touch) e partido para o iphone, resolvi também migrar meu note com linux para um macbook.

Assim como sempre vi outras pessoas comentanto, digo que o macbook é muito bom, tando em hardware como em software.

A migração foi bem tranquila, me acostumei rápido ao novo SO e ao macbook. Então comecei a “caçar” programas similares aos que usava no Linux para a plataforma da Apple. Em 95% dos casos encontrei um software similar ou até o mesmo utilizado no linux para o Mac OS.

O mais problemático foi achar um programa similar ao DeVeDe do linux, um programa extraordinário para conversão de vídeos e criação de imagens para serem gravadas em DVD (com menu e tudo).

Resolvi postar aqui uma pequena lista de 12 softwares que recomendo para utilizar no Mac OS X. Agora vamos a lista:

  1. Adium: comunicador instantâneo, suporta msn, gtalk, entre outros. Pena que não oferece suporte para webcam, mas é muito bom e tem um interface bonita.
     
  2. AppCleaner: excluir aplicativos no mac os é muito facil, mas as vezes acabam ficando arquivos perdidos, este programa procura por arquivos do programa que você pretende excluir.
     
  3. Burn: otimo gravador de cd/dvd. Também converte alguns formatos de video.
     
  4. OpenOffice/BrOffice: já utilizava no linux, então já estava acostumado com ele. Faz tempo que abandonei o MS Office.
     
  5. DiskAid: esse é muito util para quem tem iphone/ipod touch, como ele pode-se transferir arquivos via usb entre o mac e o gadget.
     
  6. FileZilla: outro que veio da migração do linux. Este programa de ftp é muito bom, recomendo.
     
  7. iAlertU: esse é bem interessante, funciona como um alarme para seu macbook. Assim com um leve deslocadomento do macbook de seu local já é o bastante para o alarme disparar.
     
  8. Kigo Video Converter: tenho muitos arquivos em RMVB e estava tendo problemas para converter e gravar no dvd, depois de testar vários programas para converter, acabei encontrado este que é o melhor de todos. (Agora posso continuar assistindo Naruto e Lost tranquilamente na TV :D ).
     
  9. Smultron: seria algo similar ao notepad++ ou gedit. Simples mas funcional, bem melhor que o TextEdit.
     
  10. TextMate: como sempre vi muito comentários recomendando este programa, resolvi testá-lo e realmente é muito bom, estou adorando programar em Ruby com o textMate, este app é totalmente clean.
     
  11. Remote Desktop Connection: conexão remota para windows. tenho um Desktop utilizado pela minha esposa com windows XP e as vezes preciso acessa-lo.
  12. FluidTunes: programa muito interessante onde podemos controlar o itunes com gestos utilizando a webcam, é bem legal para impressionar as pessoas. :D

 

Então fica aí a dica. ;)

Apple, Dica, Mac OS X, Macbook

Agora no www.imasters.com.br

18/02/09

Escrito por Rodrigo Lazoti em Artigos

Nenhum comentário

 Alguns dias atrás fui convidado pelo Tiago Baeta (coordenador da área de conteúdo do iMasters) para publicar artigos no imasters, resolvi aceitar o convite.

O primeiro artigo publicado foi um artigo copiado do blog, pois pretendo postar todos artigos que escrever tanto aqui no blog, como no imasters também.

Quem quiser conferir meus artigos publicados no imasters, o link é:

http://imasters.uol.com.br/indice/autor/113119/rodrigo_lazoti

artigo, blog, imaster
« Primeira...«678910»...Último »
  • My Linkedin Profile My Github Profile My photos on Flickr
    My Twitter My RSS Feeds My DZone Links

  • Idioma

    INGLES
    PORTUGUES

  • Recomendado

    Quer saber mais sobre desenvolvimento para Mac e iPhone SDK?

    www.macdevelopers.com.br

  • Categorias

    • ADF (1)
    • Ajax (2)
    • Artigos (11)
    • Banco de Dados (2)
    • Certicações (2)
    • Chromium OS (1)
    • Delphi (5)
    • Design Patterns (1)
    • Eclipse (3)
    • EJB (3)
    • Eventos (7)
    • Firebird (1)
    • IDE (4)
    • IMasters (1)
    • IPhone (5)
    • Java (25)
    • Java Magazine (1)
    • Javascript (4)
    • Jboss Seam (1)
    • JDeveloper (1)
    • JPA (1)
    • JSF (4)
    • Linux (2)
    • Livros (4)
    • Log4J (1)
    • Mac OS X (7)
    • MySQL (1)
    • Netbenas (1)
    • Objective-C (3)
    • Oracle (1)
    • Programação (37)
    • Promoções (2)
    • Ruby (4)
    • Ruby on Rails (3)
    • Sem categoria (2)
    • Sistema Operacional (5)
    • Spring Roo (1)
    • Sql (1)
    • Struts (1)
    • Testes Unitários (1)
    • Twitter (1)
    • Wordpress (2)
  • Tópicos recentes

    • Dominando o Spring Roo, publicado na Java Magazine 79
    • Alteração de feed RSS
    • Testando JavaEE 6 com Glassfish e Eclipse
    • Dev in Sampa 28/11, eu Vou!
    • [Video] Testando o Chromium OS no Virtual Box
  • Últimos comentários

    • jorge cruz em Dominando o Spring Roo, publicado na Java Magazine 79
    • Ademar em Testando JavaEE 6 com Glassfish e Eclipse
    • Lorena em Framework javascript Extjs em páginas jsp com tags tld
    • gleydson santos de souza em Criptografia Triple DES em Java
    • paulo em Filtrando requisições em JSF com PhaseListener
    • Rodrigo Lazoti em Testando JavaEE 6 com Glassfish e Eclipse
  • Meus tweets recentes

    Carregando tweets...
    Siga-me no Twitter!
  • Lista de Links

    • Akita on Rails
    • Anderson Leite
    • Cássio Marques
    • Desenvolvedores da Caelum
    • Diego Carrion
    • Fabio Kung
    • Fernando Meyer
    • Guilherme Chapiewski
    • Paulo Poiati
    • Rodrigo Urubatan
  • Visitantes Online

Direitos autorais © 2010 Rodrigo Lazoti Blog