Domanda

Stavo sfogliando il libro Ruby di programmazione e ho problemi a comprendere i seguenti concetti:

  1. Gli autori parlano di "eccezioni transitorie" che può verificarsi nel codice e quindi suggerire una creazione del proprio oggetto eccezione per gestirli. Non credo di aver compreso appieno cos'è un errore temporaneo e quando è appropriato creare il proprio oggetto Exception. Ne parla in Capitolo 6 quando parla della definizione delle eccezioni:
  

Ad esempio, alcuni tipi di errori di rete potrebbero essere temporanei. Capitolo 6.Pagina 97. Aggiunta di informazioni alle eccezioni.

  1. Sto anche facendo fatica ad aggirare l'uso di Catch and Throw in ruby. Quando è meglio che sollevare e salvare?
È stato utile?

Soluzione

Puoi darci un riferimento alla pagina delle "eccezioni transitorie"? linea?

In ogni caso, puoi creare una nuova eccezione in qualsiasi momento, ed è generalmente bene farlo in modo da poter trasferire più informazioni sull'errore. Ciò è particolarmente utile quando hai un'eccezione di livello basso e vuoi trasformarla in qualcosa di più significativo per l'utente.

Throw / Catch in Ruby è davvero una specie di goto non locale, come setjmp / longjmp in C, ma si comporta meglio. Lo useresti ogni volta che vuoi trasferire l'esecuzione a lungo.

Ovviamente, per lo stesso motivo per cui non vuoi usare molto goto , non vuoi farlo. Un grande motivo per cui potresti usarlo è nel caso di un programma che deve rimanere in esecuzione, quindi se rilevi alcuni tipi di errori, potresti scaricare l'intero lavoro che stai facendo e tornare all'inizio.


Ok, quello non sembra essere a pagina 97 di nessuna delle edizioni del libro del piccone che ho, ma vedo cosa significa. ... oh, eccola qui, pagina 157 della terza edizione.

Innanzitutto, per quanto riguarda il "transitorio", ci sono alcuni problemi di rete che possono verificarsi e quindi risolversi autonomamente, ad esempio quando il BOFH scollega il cavo di rete e lo ricollega. Quindi, in alcune condizioni, potresti volerci qualche secondo per sistemarti e riprovare prima di andare nel panico. come lo faresti?

In questo caso, hanno definito un nuovo tipo di eccezione. Questo viene fatto solo con l'ereditarietà:

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

quindi se qualcosa va storto, puoi sollevare queste nuove eccezioni ripetibili

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

che ora invia qualcosa che è una specie di RuntimeError nello stack, ma ora ha delle informazioni aggiuntive ad esso collegate, cioè un flag che dice "sì, questo può essere riprovato."

NO, ecco una cosa davvero elegante in Ruby: ha una capacità integrata di riprovare alcune cose. Quindi, da qualche parte nello stack, hai questo codice:

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top