Ruby: Eccezioni per il controllo del flusso all'interno di un blocco .each

1

Considera il seguente esempio minimo:

class SomeException < StandardError
end

class Example
  @@logger = Logger.new
  @@failure_count = 0

  def do_a_thing(array)
    raise SomeException unless array.some_check?
    # more random code
  end

  def some_long_process(array)
    array.each do |item|
      begin
        do_a_thing(item)
        do_something_else(item)
        do_yet_another_thing(item)
      rescue SomeException
        @@logger.error 'Process failed'
        @@failure_count += 1
        next
       end
     end
   @@logger.info("Process done, #{@@failure_count} failures")
   end

Il motivo per cui ho strutturato il codice in questo modo è che il lavoro principale di questa classe è quello di scorrere una serie di hash. Se l'attività do_a_thing fallisce, mi serve per registrare quell'errore, fare un po 'di pulizia, e poi saltare il resto dei passaggi in quel blocco begin . Ogni possibile errore in questi passaggi viene segnalato aumentando SomeException .

Tuttavia, sono consapevole che l'utilizzo di eccezioni per il controllo del flusso è generalmente scoraggiato. Le mie ragioni per farlo qui sono:

  1. La libreria (Mechanize) utilizzata nei vari passi do_thing genererà automaticamente un'eccezione se ottiene un ritorno HTML fasullo, che si presta bene all'organizzazione logica di questa classe.

  2. Voglio contare gli errori su stdout, dato che questo fa parte di una gemma che verrà utilizzata per eseguire il lavoro automatizzato.

  3. Voglio mantenere la registrazione degli errori di passaggio in questi metodi se possibile a causa della grande varietà di possibili errori e utilizzare il ciclo .each esterno solo per la contabilità.

Voglio sapere se c'è un modo più chiaro / più idiomatico / meno codice per realizzare questo stesso compito. È questo il modo giusto per usare le eccezioni?

    
posta Mikey T.K. 01.04.2018 - 20:45
fonte

0 risposte

Leggi altre domande sui tag