2010-03-26 29 views
25

En ruby ​​para detectar un error, se usa la instrucción rescue. en general, esta afirmación se produce entre begin y end. También se puede usar una instrucción rescue como parte de un bloque (do ... end) o un método (def ... end). Mi pregunta es ¿qué otras estructuras (lazo, tiempo, si, ...) si alguien rescatará el nido dentro?En Ruby, ¿Qué estructuras puede anidar una instrucción `rescue` en

+0

'do ... end' no se pueden rescatar bloques sin un' begin ... end' explícito. – Nick

Respuesta

34

Sólo se puede utilizar de rescate en dos casos:

  • Dentro de un bloque

    begin 
        raise 
    rescue 
        nil 
    end 
    
  • begin ... end Como modificador comunicado

    i = raise rescue nil 
    

función, Modul e, y los cuerpos de clase (gracias Jörg) son implícitos begin...end bloques, por lo que puede rescatar dentro de cualquier función sin un explícito begin/end.

def foo 
     raise 
    rescue 
     nil 
    end 

La forma de bloque tiene una lista opcional de parámetros, especificando qué excepciones (y descendientes) a rescue:

begin 
     eval string 
    rescue SyntaxError, NameError => boom 
     print "String doesn't compile: " + boom 
    rescue StandardError => bang 
     print "Error running script: " + bang 
    end 

Si se llama línea como un modificador de declaración, o sin argumento dentro de un begin/end bloque, rescate atrapará StandardError and its descendants.

Aquí está el 1.9 documentation on rescue.

+3

los cuerpos de 'módulo' y' clase' son también bloques 'begin' implícitos. –

+1

@ Jörg W Mittag: al igual que las definiciones de los métodos 'do ... end' y' def ... end'. ¿Hay algo más que sea un "comienzo" implícito? 'while',' case', o 'if' por ejemplo? –

+7

@john - do ... end no es un comienzo implícito ... final. – klochner

Cuestiones relacionadas