Ruby Language Gestire un'eccezione


Esempio

Usa il blocco begin/rescue per rilevare (salvare) un'eccezione e gestirla:

begin
  # an execution that may fail
rescue
  # something to execute in case of failure
end

Una clausola di rescue è analoga a un blocco catch in un linguaggio di parentesi graffa come C # o Java.

Un semplice rescue come questo salva StandardError .

Nota: fare attenzione ad evitare l'intercettazione di Exception anziché l'errore StandardError predefinito. La classe Exception include SystemExit e NoMemoryError e altre eccezioni serie che di solito non si desidera NoMemoryError . Considerare sempre la cattura di StandardError (il valore predefinito).

È inoltre possibile specificare la classe di eccezioni da salvare:

begin
  # an excecution that may fail
rescue CustomError
  # something to execute in case of CustomError
  # or descendant
end

Questa clausola di salvataggio non catturerà alcuna eccezione che non sia un'eccezione CustomError .

È inoltre possibile memorizzare l'eccezione in una variabile specifica:

begin
  # an excecution that may fail
rescue CustomError => error
  # error contains the exception
  puts error.message # provide human-readable details about what went wrong.
  puts error.backtrace.inspect # return an array of strings that represent the call stack
end

Se non si è riusciti a gestire un'eccezione, è possibile aumentarla in qualsiasi momento in un blocco di salvataggio.

begin
   #here goes your code
rescue => e
    #failed to handle 
    raise e
end

Se si desidera ripetere la begin blocco, chiamare retry :

begin
   #here goes your code
rescue StandardError => e
   #for some reason you want to retry you code
   retry
end

Puoi essere bloccato in un ciclo se rilevi un'eccezione in ogni nuovo tentativo. Per evitare ciò, limita il tuo retry_count a un certo numero di tentativi.

retry_count = 0
begin
      # an excecution that may fail
rescue
    if retry_count < 5
        retry_count = retry_count + 1
        retry
    else
        #retry limit exceeds, do something else
    end

Puoi anche fornire un blocco else o un blocco di ensure . Un else blocco sarà eseguito quando il begin blocco completa senza eccezione generata. Un blocco di ensure verrà sempre eseguito. Un ensure blocco è analogo ad un finally blocco in una lingua parentesi graffa come C # o Java.

begin
  # an execution that may fail
rescue
  # something to execute in case of failure
else
  # something to execute in case of success
ensure
  # something to always execute
end

Se si è all'interno di un def , module o blocco di class , non è necessario utilizzare l'istruzione begin.

def foo
    ...
rescue
    ...
end