# Codice Reby che non riesco a capire: qualcuno me lo spiega?

**URL:** <https://www.ruby-forum.com/t/codice-reby-che-non-riesco-a-capire-qualcuno-me-lo-spiega/190110>\
**Category:** IT\
**Created:** [June 15, 2010, 4:06pm UTC](https://www.ruby-forum.com/t/codice-reby-che-non-riesco-a-capire-qualcuno-me-lo-spiega/190110 "2010-06-15T16:06:10Z")\
**Posts on this page:** 4\
**Page:** 1

<div class="post-metadata">

**Author:** ![axle988](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/e47774/32.png) [@axle988](https://www.ruby-forum.com/u/axle988)\
**Post date:** [June 15, 2010, 4:06pm UTC](https://www.ruby-forum.com/t/codice-reby-che-non-riesco-a-capire-qualcuno-me-lo-spiega/190110/1 "2010-06-15T16:06:10Z")

</div>

Ciao.  
Io ho il seguente codice che non riesco a capire:

def write\_to\_file  
begin  
File.open(‘Tale.txt’,‘w’) { |file|  
file.puts @author  
file.puts @genre  
file.puts @tale\_body  
}  
rescue Exception =\> ex  
$stderr.print “File open failed!”  
end  
end

In particolare non riesco a capire cosa succede in caso di eccezione:  
finora quello che ho capito Ã¨ che la clausola “rescue” cattura tutte le  
eccezioni, poi fa qualcosa che non so con ex, poi utilizza il metodo di  
classe sulla variabile globale di Ruby “stderr”.  
Qualcuno mi puÃ² fare chiarezza?  
Ciao.  
KioSirio

---

<div class="post-metadata">

**Author:** ![axle988](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/e47774/32.png) [@axle988](https://www.ruby-forum.com/u/axle988)\
**Post date:** [June 17, 2010, 4:22pm UTC](https://www.ruby-forum.com/t/codice-reby-che-non-riesco-a-capire-qualcuno-me-lo-spiega/190110/2 "2010-06-17T16:22:34Z")

</div>

2010/6/15 Ivan M. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)

> rescue Exception =\> ex

come hai detto tu cattura l’eccezione e la chiama ex  
ma con ex non ci fa niente

> $stderr.print “File open failed!”

semplicemente scrive sullo standard error “File open failed!”

Forse devi guardarti i concetti di standard Input, Standard Output e  
Standard Error  
io poche parole sulla shell, il primo è quello che viene scritto (o che  
viene da un pipe),  
il secondo è l’output del programma il terzo è l’output di errore del  
programma  
di solito corrispondono a 0, 1 e 2

---

<div class="post-metadata">

**Author:** ![axle988](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/e47774/32.png) [@axle988](https://www.ruby-forum.com/u/axle988)\
**Post date:** [June 17, 2010, 4:22pm UTC](https://www.ruby-forum.com/t/codice-reby-che-non-riesco-a-capire-qualcuno-me-lo-spiega/190110/3 "2010-06-17T16:22:48Z")

</div>

2010/6/15 Ivan M. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)

> }

In realta’ ci sono due aspetti di rescue, leggermente “intrecciati”.  
Uno e’ che rescue senza niente dopo e’ sinonimo di rescue  
StandardError (e quindi, se fai riferimento a questa pagina ad  
esempio: [Ruby's Exception Hierarchy](http://blog.nicksieger.com/articles/2006/09/06/rubys-exception-hierarchy)  
vedrai che rescue Exception intercetta piu’ eccezioni - il che a volte  
e’ un bene, a volte no). L’altro aspetto e’ puramente syntactic sugar,  
ovvero, con la sintassi =\> ex assegni alla variabile locale ex il  
valore della globale $! - in pratica, $! proviene storicamente da  
bash/perl/etc ed e’ un po’ brutto da vedere mentre ‘=\> il\_mio\_errore’  
e’ un po’ piu’ bello - soprattutto se poi ci chiami dei metodi (tipo  
il\_mio\_errore.message che e’ la stessa cosa di il\_mio\_errore.to\_s e  
che dice cosa e’ successo davvero)  
Ad esempio questo script che hai postato mi sa che e’ leggermente  
scorretto, ovvero, e’ molto probabile che l’errore sia effettivamente  
nella File.open, ma siccome lui rescua qualsiasi tipo di eccezione  
(essendo Exception la superclasse di tutte) in effetti il problema  
potrebbe essere un altro - tipo che hai finito la ram, o uno  
qualsiasi). Oltretutto non stampando in nessun modo il messaggio  
dell’eccezione stessa non c’e’ neanche modo di saperlo!  
Infine, specificare il tipo di eccezioni che quel pezzo di codice  
rescua ti permette di essere selettivo, e di considerare in modo  
diverso i vari tipi di eccezione, ad esempio (da ‘programming ruby’)

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

Ciao

---

<div class="post-metadata">

**Author:** ![axle988](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/e47774/32.png) [@axle988](https://www.ruby-forum.com/u/axle988)\
**Post date:** [June 17, 2010, 4:26pm UTC](https://www.ruby-forum.com/t/codice-reby-che-non-riesco-a-capire-qualcuno-me-lo-spiega/190110/4 "2010-06-17T16:26:59Z")

</div>

Ciao,  
Per ottenere qualcosa di significativo sarebbe meglio scriverci nel  
file, ad  
esempio

File.open(‘Tale.txt’,‘w’) do |f|  
f.write “@author”  
f.write “@genre”  
end  
Ricky

2010/6/15 Luca De Marinis [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)
