Ruby Language Gérer une exception


Exemple

Utilisez le bloc begin/rescue pour intercepter (sauver) une exception et la gérer:

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

Une clause de rescue est analogue à un bloc catch dans une accolade comme C # ou Java.

Un rescue brutal comme celui-ci sauve StandardError .

Remarque: veillez à ne pas intercepter Exception place de StandardError par défaut. La classe Exception inclut SystemExit et NoMemoryError et d'autres exceptions graves que vous ne souhaitez généralement pas intercepter. Toujours envisager d'attraper StandardError (valeur par défaut) à la place.

Vous pouvez également spécifier la classe d'exception à récupérer:

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

Cette clause de secours n'acceptera aucune exception qui n'est pas une CustomError .

Vous pouvez également stocker l'exception dans une variable spécifique:

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

Si vous ne parvenez pas à gérer une exception, vous pouvez l'augmenter à tout moment dans un bloc de secours.

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

Si vous voulez retenter votre begin bloc, appelez retry :

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

Vous pouvez être bloqué dans une boucle si vous attrapez une exception dans chaque tentative. Pour éviter cela, limitez votre retry_count de retry_count à un certain nombre d'essais.

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

Vous pouvez également fournir un else bloc ou un bloc d’ ensure . Un bloc else sera exécuté lorsque le bloc de begin termine sans qu'une exception soit lancée. Un bloc d’ ensure sera toujours exécuté. Un bloc d' ensure est analogue à un bloc finally dans une accolade comme C # ou 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

Si vous vous trouvez dans un bloc def , module ou class , il n'est pas nécessaire d'utiliser l'instruction begin.

def foo
    ...
rescue
    ...
end