# Warning come eccezione (Era: rescue warning)

**URL:** <https://www.ruby-forum.com/t/warning-come-eccezione-era-rescue-warning/181127>\
**Category:** IT\
**Created:** [January 6, 2010, 12:03am UTC](https://www.ruby-forum.com/t/warning-come-eccezione-era-rescue-warning/181127 "2010-01-06T00:03:31Z")\
**Posts on this page:** 6\
**Page:** 1

<div class="post-metadata">

**Author:** ![gabriele\_renzi](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/g/e19b73/32.png) [@gabriele\_renzi](https://www.ruby-forum.com/u/gabriele_renzi)\
**Post date:** [January 6, 2010, 12:03am UTC](https://www.ruby-forum.com/t/warning-come-eccezione-era-rescue-warning/181127/1 "2010-01-06T00:03:31Z")

</div>

2010/1/4 Paolo M. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):

> la stessa cosa, creando una classe Warning che derivi da Exception e che  
> faccia la puts del messaggio nell’initialize, ma è possibile che ci  
> siano dettagli dei warning smalltalk che mi sfuggono.

Mh… non son sicuro ma credo sia più complesso. La cosa che stampa non  
è l’eccezione, ma l’handler, per cui sarebbe

def foo()  
warn  
rescue Warning  
puts warning.message  
end

Ma considera il codice

def read\_logs(io)  
io.each do |line|  
do\_parse(line)  
end  
end

def do\_parse(line)  
if …  
…  
else  
warn(“parsing went wrong”)  
nil  
end  
end

se la warn lanciasse un’eccezione invece di fare side effect il flusso  
di controllo in ruby sarebbe interrotto, e fondamentalmente  
irrecuperabile. In Smalltalk esiste la possibilità di fare un #resume  
dell’eccezione per cui l’handler può limitarsi a fare la print su  
stderr dell’errore e poi riprendere il flusso normale.

Avevamo un po’ di smalltalker in lista, chissà che fine han fatto 🙂

---

<div class="post-metadata">

**Author:** ![gabriele\_renzi](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/g/e19b73/32.png) [@gabriele\_renzi](https://www.ruby-forum.com/u/gabriele_renzi)\
**Post date:** [January 6, 2010, 10:16am UTC](https://www.ruby-forum.com/t/warning-come-eccezione-era-rescue-warning/181127/2 "2010-01-06T10:16:38Z")

</div>

> def do\_parse(line)  
> if …  
> …  
> else  
> warn(“parsing went wrong”)  
> nil  
> end  
> end
> 
> se la warn lanciasse un’eccezione invece di fare side effect il flusso  
> di controllo in ruby sarebbe interrotto, e fondamentalmente  
> irrecuperabile. In Smalltalk esiste la possibilitï¿½ di fare un #resume  
> dell’eccezione per cui l’handler puï¿½ limitarsi a fare la print su  
> stderr dell’errore e poi riprendere il flusso normale.
> 
> Avevamo un po’ di smalltalker in lista, chissï¿½ che fine han fatto 🙂

e se lo fai cosÃ¬ :

def do\_parse(line)  
begin …  
…  
rescue Exception =\> e  
puts “Warning … #{e.inspect}”  
return e  
end  
end

chiaramente puoi anche chiamare un metodo, o modificare la classe  
Exception per ar sÃ¬ che a seconda dell’errore faccia output e continui  
oppure faccia output ed esca oppure esca solo o non faccia niente…

---

<div class="post-metadata">

**Author:** ![gabriele\_renzi](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/g/e19b73/32.png) [@gabriele\_renzi](https://www.ruby-forum.com/u/gabriele_renzi)\
**Post date:** [January 7, 2010, 10:59pm UTC](https://www.ruby-forum.com/t/warning-come-eccezione-era-rescue-warning/181127/3 "2010-01-07T22:59:49Z")

</div>

2010/1/6 Alessandro S. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):

> chiaramente puoi anche chiamare un metodo, o modificare la classe  
> Exception per ar sì che a seconda dell’errore faccia output e continui  
> oppure faccia output ed esca oppure esca solo o non faccia niente…

devi moltiplicare il codice che gestisce le eccezioni e stampa in  
tutto il tuo codice, se hai eccezioni resumabili basta che ci sia un  
exception handler per l’intero programma, è abbastanza diverso 🙂

---

<div class="post-metadata">

**Author:** ![gabriele\_renzi](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/g/e19b73/32.png) [@gabriele\_renzi](https://www.ruby-forum.com/u/gabriele_renzi)\
**Post date:** [January 8, 2010, 10:01am UTC](https://www.ruby-forum.com/t/warning-come-eccezione-era-rescue-warning/181127/4 "2010-01-08T10:01:12Z")

</div>

2010/1/7 Alessandro S. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):

> > devi moltiplicare il codice che gestisce le eccezioni e stampa in  
> > tutto il tuo codice, se hai eccezioni resumabili basta che ci sia un  
> > exception handler per l’intero programma, ï¿½ abbastanza diverso 🙂
> 
> PerchÃ¨…? basta che modifichi la classe Exception… mica devi  
> modificare il tuo codice…

nel tuo esempio hai aggiunto un begin/end, che Ã¨ modificare il tuo  
codice. Se modifichi exception per fargli stampare output non cambia  
il fatto che interrompe il flusso di controllo, perchÃ© Ã¨ #raise che lo  
cambia non Exception::new. Inoltre, se fai la puts in  
Exception#initialize hai perso la possibilitÃ di avere controllo su di  
essa

Scusa, non riesco a spiegarmi bene o non capisco quel che dici.

Questo funzionerebbe in un ruby con eccezioni resumabili:

# la roba commentata sarebbe nel main interpreter loop, nascosta

all’utente

# begin

def warn(msg)  
raise(Warning.new(msg))  
end

def read\_logs(io)  
io.each do |line|  
do\_parse(line)  
end  
end

def do\_parse(line)  
if …  
…  
else  
warn(“parsing went wrong”)  
end  
end

# here we silence warnings in a thread safe granular way

def ignoring\_warns()  
do\_parse “broken line”  
rescue Warning w #  
if w.message == “parsing went wrong” #skip  
w.resume  
end  
end

# rescue Warning w

# if Log.level \< w.level

# $stderr.puts w.message

# end

# w.resume

# end

ma #resume non esiste nelle eccezioni ruby (_si puÃ²_ emularlo usando  
callcc e contorcendosi, ma Ã¨ molto lento).

Io non vedo un modo in cui cui il codice sopra possa funzionare, e che  
quindi non richieda di modificare il codice per accomodare un concetto  
di warning-as-exception, ma forse son solo miope 🙂

---

<div class="post-metadata">

**Author:** ![gabriele\_renzi](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/g/e19b73/32.png) [@gabriele\_renzi](https://www.ruby-forum.com/u/gabriele_renzi)\
**Post date:** [January 7, 2010, 11:07pm UTC](https://www.ruby-forum.com/t/warning-come-eccezione-era-rescue-warning/181127/5 "2010-01-07T23:07:43Z")

</div>

gabriele renzi wrote:

> 2010/1/6 Alessandro S. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):
> 
> > chiaramente puoi anche chiamare un metodo, o modificare la classe  
> > Exception per ar sï¿½ che a seconda dell’errore faccia output e continui  
> > oppure faccia output ed esca oppure esca solo o non faccia niente…
> 
> devi moltiplicare il codice che gestisce le eccezioni e stampa in  
> tutto il tuo codice, se hai eccezioni resumabili basta che ci sia un  
> exception handler per l’intero programma, ï¿½ abbastanza diverso 🙂

PerchÃ¨…? basta che modifichi la classe Exception… mica devi  
modificare il tuo codice…

---

<div class="post-metadata">

**Author:** ![gabriele\_renzi](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/g/e19b73/32.png) [@gabriele\_renzi](https://www.ruby-forum.com/u/gabriele_renzi)\
**Post date:** [January 8, 2010, 1:11pm UTC](https://www.ruby-forum.com/t/warning-come-eccezione-era-rescue-warning/181127/6 "2010-01-08T13:11:21Z")

</div>

gabriele renzi wrote:

> def do\_parse(line)  
> if …  
> …  
> else  
> warn(“parsing went wrong”)  
> end  
> end
> 
> Io non vedo un modo in cui cui il codice sopra possa funzionare, e che  
> quindi non richieda di modificare il codice per accomodare un concetto  
> di warning-as-exception, ma forse son solo miope 🙂

Siamo in 2 🙂

il tuo problema Ã¨ che se la exception viene sollevata dentro il ciclo if  
sei comunque a piedi se non modifichi o la classe exception oppure il  
metodo raise (che non Ã¨ detto debba per forza terminare il programma…)
