Pergunta

Eu estava passando pelo livro de Ruby Programação e eu estou tendo problemas compreender os seguintes conceitos:

  1. Os autores falam sobre "exceções transitórias" que podem ocorrer no código e, em seguida, sugerem uma criação de seu próprio objeto de exceção para lidar com eles. Eu não acho que eu compreendo perfeitamente o que é um erro transitório é e quando é apropriado para fazer o seu próprio objeto de exceção. Ele fala sobre isso em Capítulo 6 quando ele fala sobre a definição de exceções:

Por exemplo, certos tipos de erros de rede pode ser transitória. Capítulo 6.Page 97. Adição de informações para exceções.

  1. Eu também estou tendo um momento difícil se locomover o uso de pegar e jogar em ruby. Quando é este melhor do que levantar e salvamento?
Foi útil?

Solução

Você pode nos dar uma referência de página para a linha "transitória exceções"?

Em qualquer caso, você pode criar uma nova exceção a qualquer momento, e é comumente bom para fazê-lo de modo que você pode transferir mais informações sobre a falha. Isto é particularmente bom quando você tem alow exceção de nível e quer torná-lo em algo mais significativo para o usuário.

Lance / catch em Ruby são realmente uma espécie de Goto não-local, como setjmp / longjmp em C, mas melhor comportado. Você poderia usá-lo sempre que quiser tranfer execução um longo caminho.

Obviamente, pela mesma razão que você não quer usar goto muito, você não quer fazer isso. Um grande motivo que você pode usá-lo é em um caso de um programa que precisa para se manter funcionando, por isso, se você pegar certos tipos de erros, você pode despejar toda a peça de trabalho que você está fazendo e voltar para o início.


Ok, isso não parece estar na página 97 de uma das edições do livro picareta que eu tenho, mas eu vejo o que isso significa. ... oh, aqui está, página 157 na terceira edição.

Em primeiro lugar, sobre o negócio sobre "transitória", existem alguns problemas de rede que podem ocorrer, e depois resolver-se, digamos, quando o BOFH desconecta o cabo de rede e plugues-lo de volta. Então, sob algumas condições, você pode querer dar-lhe alguns segundos para se acalmar e tentar novamente antes de entrar em pânico. como você faria isso?

Neste caso, eles têm de definir um novo tipo de exceção. Isto é feito apenas com herança:

class RetryException < RuntimeError
  # so this is a kind of RuntimeError which is a kind of Exception
  attr: ok_to_retry
  def initialize(ok_to_retry)
     @ok_to_retry
  end
end

Assim, pois, se algo der errado, você pode aumentar em destas novas excepções nova tentativa

raise RetryException.new(true), "transient read error"

que agora envia algo que é uma espécie de RuntimeError a pilha, mas agora tem a informação adicional ligado a ele, ou seja, uma bandeira que diz "sim, isso pode ser repetida."

Agora, aqui está um realmente bacana coisa em Ruby: ele foi construído em um recurso de tentar novamente algumas coisas. Então, em algum lugar até a pilha, você tem este código:

begin
   # do something that raises this exception
   do_something()
rescue RetryException => detail 
   # if the exception is one of these retryable ones, 
   # catch it here, but it in detail
   if detail.ok_to_retry  
      retry
   end
   # this means exactly the same as 'retry if detail.ok_to_retry`
   # from the book, btw

   # if it STILL doesn't work, send the exception on
   raise # just re-raises the last exception
end
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top