O que a palavra-chave fail faz em Ruby?

88

Estou aprendendo Ruby e encontrei a failpalavra - chave. O que isso significa?

if password.length < 8
   fail "Password too short"
end
unless  username
   fail "No user name set"
end
Sonhos
fonte
9
Além das respostas abaixo, vale a pena saber que as pessoas usam raiseao lidar com exceções e failquando não.
Bala de
6
Não é uma palavra-chave, é um método.
Jörg W Mittag
Documentação: Kernel # falhou
Jared Beck
Observe também que você pode escrevê-las como declarações de uma única linha: fail "Password too short" if password.length < 8efail "No user name set" unless username
PhilT

Respostas:

137

Em Ruby, failé sinônimo de raise. A failpalavra-chave é um método do Kernelmódulo incluído pela classe Object. O failmétodo gera um erro de tempo de execução, assim como oraise palavra chave.

O failmétodo tem três sobrecargas:

  • fail: gera um RuntimeErrorsem uma mensagem de erro.

  • fail(string): levanta um RuntimeErrorcom o argumento string como uma mensagem de erro:

    fail "Failed to open file"
    
  • fail(exception [, string [, array]]): levanta uma exceção de classe exception(primeiro argumento) com uma mensagem de erro opcional (segundo argumento) e informações de retorno de chamada (terceiro argumento).

    Exemplo: suponha que você defina uma função que deve falhar se for fornecido um argumento incorreto. É melhor criar um ArgumentErrore não um RuntimeError:

    fail ArgumentError, "Illegal String"
    

    Outro exemplo: você pode passar todo o backtrace para o failmétodo para que possa acessar o trace dentro do rescuebloco:

    fail ArgumentError, "Illegal String", caller
    

    calleré um método Kernel que retorna o backtrace como um array de strings no formulário file:line: in 'method'.

Sem argumentos, levanta a exceção em $! ou aumenta um RuntimeError se $! é nulo. Com um único argumento String, gera um RuntimeError com a string como uma mensagem. Caso contrário, o primeiro parâmetro deve ser o nome de uma classe Exception (ou um objeto que retorna um objeto Exception ao enviar uma mensagem de exceção). O segundo parâmetro opcional define a mensagem associada à exceção e o terceiro parâmetro é uma matriz de informações de retorno de chamada. As exceções são capturadas pela cláusula de resgate dos blocos begin ... end.

Fonte: Documentação Ruby no Módulo Kernel .

maluco
fonte
2
Você pode dar 3 exemplos simples com os 3 pontos de bala? Isso tornará sua resposta mais concreta .. :)
Arup Rakshit
1
Uau, +1, crazybob é melhor que Ruby docs ruby-doc.org/core-2.0.0/Kernel.html#method-i-raise :-)))
Boris Stitnicky
Funcionou para mim, mas Rubocop o converteu pararaise
paul de
32

Rubocop fala sobre o uso de ambas as palavras;

'Use em failvez de raisepara sinalizar exceções.'

'Use em raisevez de failpara relançar exceções.'

Aqui está um exemplo.

def sample
  fail 'something wrong' unless success?
rescue => e
  logger.error e
  raise
end
Kuboon
fonte
1 para aconselhamento de estilo; mesmo que sejam semanticamente idênticos, usar cada um em sua configuração pretendida ajuda a transmitir melhor a intenção
fatuhoku
26

fail == raise

Em outras palavras, failé apenas um apelido popular para raisemétodo de levantamento de erros. Uso:

fail ArgumentError, "Don't argue with me!"
Boris Stitnicky
fonte
7

www.ruby-doc.org é seu amigo. Quando eu pesquisei rubydoc fail" Kernel " foi o primeiro hit. Meu conselho é, em caso de dúvida, vá para a fonte definitiva de coisas de definição como esta.

pjs
fonte
2
Woot, isso realmente é uma FALHA. O exemplo de código para falha é copiar e colar de raise o_O
Vajk Hermecz
4
@VajkHermecz fail é um apelido para raise, então ele reutiliza a documentação. Compare com os documentos de Array # map e Array # collect
Jamie Macey