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:
-
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.
-
Voglio contare gli errori su stdout, dato che questo fa parte di una gemma che verrà utilizzata per eseguire il lavoro automatizzato.
-
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?