Forums » RGSS

Lição 12 de RGSS - Tratamento de Erros

    • 683 posts
    4 de junho de 2015 13h29min48s ART

    Olá Amigos !!
    Depois de muito muito tempo sem postar nada, estou aqui de volta com algo muito muito importante, e me desculpem os outros "professores" se esse assunto já foi tratado.

    Quando escrevemos algum código errado, ou alguma validação ficou errada, ou qualquer outra coisa que fique ERRADA, toda e qualquer linguagem de programação chama esse evento de Exceção(Exception, em inglês). Uma Exceção é algo que não deveria acontecer, mas aconteceu, e quando as Exceções não são tratadas, o compilador do código simplesmente "vomita" o erro na cara de quem está executando aquilo e fecha a aplicação. Tenho certeza que você, jovem mancebo maker, já recebeu várias janelas de erro como essa abaixo:
    Imagem Postada

    Isso, você sabe porque? porque o seu código não foi tratado. o RGSS por padrão não possui tratamento de Exceções em suas classes. Com certeza com o intuito de que o códigoSEMPRE ESTEJA CORRETO.
    Mas como RGSS é uma linguagem experta como as outras, ele possui sim, funções de tratamento de exceções e, diferentemente de algumas linguagens, ele possui validações específicas para cada tipo de Exceção.

    Este mecanismo de tratamento de exceções oferece várias vantagens. Através dele é possível isolar o código responsável pelo tratamento do erro em blocos separados, deixando o código principal mais limpo. Também é possível tratar erros similares com um único bloco de tratamento, eliminando código duplicado. Existe até a possibilidade de transferir o tratamento de uma exceção para outros métodos, tornando o código mais enxuto ainda.

    Mas e ae, como se usa essa bagaça?

    A sintaxe é simples. Veja:

    def algumacoisa begin#Abre-se com Begin<seu código aqui>rescue#Aqui capturamos o erro<aqui tratamos o erro>end#End do Beginend


    A única coisa que muda do código que costumamos escrever, é a adição de um bloco begin - end com um rescue onde trataremos o erro, caso ele aconteça. Vamos fazer um teste? adicione na classe Scene_Title logo depois de def main o seguinte bloco:

    begin       print("Estou antes do Raise")       #O raise faz com que eu "Invoque" um erro"       raise"Esta é uma janela de Erro simuada."       print("Estou depois do Raise")     rescueException=> e       print("Houve um erro:\n"+e.message)     end


    Ao executar, você receberá a primeira mensagem, o raise irá invocar um erro com o texto "Esta é uma janela de Erro simuada." e, observe que você não verá a mensagem"Estou depois do Raise". você verá a mensagem que está dentro do bloco rescue, mais a mensagem que o raise enviou. Este é um caso de erro simulado, só para ver o rescue funcionando. Porém, você pode aplicar este bloco de código em qualquer método/evento/função, que ele vai tratar qualquer problema que você tiver.
    Observe que eu coloquei na frente do rescue a palavra Exception. Isso indica que eu estou pegando de modo Geral qualquer tipo de exceção que cair aqui. O ruby, assim como várias linguagens de programação, possui tipagem de exceções também, o que faz com que se possa tratar cada tipo de exceção de forma diferente. A lista abaixo mostra quais são os tipos comuns de Exceções do Ruby:
    Imagem Postada

    Você também deve ter reparado que eu coloquei a palavra message na frente do e. Isso porque, ao dizer Exception => e eu estou atribuindo a Exceção do e, de forma a poder tratá-lo dentro do rescue. Para saber mais sobre outros métodos e eventos da classe Exception, consulte Este link.
    Por fim, como eu dizia antes, podemos tratar cada tipo de exceção de uma forma diferente. para isso, podemos ter vários rescues, passando o tipo de Exceção e recuperando aquele que nos interessa. Mude o código do Scene_Title para este:

    begin       print("Estou antes do Raise")       #O raise faz com que eu "Invoque" um erro"       raise"Esta é uma janela de Erro simuada."       print("Estou depois do Raise")     rescueScriptError       print("ScriptError - Houve um erro:\n"+e.message)     rescueStandardError=> e       print("StandardError - Houve um erro:\n"+e.message)     rescueException=> e       print("Exception - Houve um erro:\n"+e.message)     end


    Observe que há 3 tipos de tratamento. Ao executar, ele cairá no StandardError, pois o erro invocado pelo raise é um erro comum. Por fim, podemos tratar nosso erro e as vezes até retornar a executar o bloco begin - end, para que alguma codificação não necessite ser reescrita. Para isso usamos a RW(Reserved Word, palavra reservada) retry.
    No código abaixo, eu avalio se a var @valor é igual a 1, senão, eu jogo uma exceção e, no tratamento dela, eu mudo a var para 0, fazendo com que todo o bloco seja executado de novo.

    @valor=1     begin         if(@valor==1)then           raise"valor errado."         end       print("valor certo")     rescueException=> e       if(@valor==1)then         print(e.message +"Corrigindo...")         @valor=0         retry       end     end


    Bem, como eu sempre digo, foi apenas uma pincelada. Sabe aquele código que vive te dando trabalho? faça um teste usando o rescue. experimente, e você verá que vários de seus problemas poderão acabar, apenas tratando erros simples.

    Assim que eu puder e tiver algo legal pra falar, eu vou a postar. Duvidas? postem aqui, tentarei responder a todas.
    Até a próxima.