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
2010/6/15 Ivan M. [email protected]
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
2010/6/15 Ivan M. [email protected]
}
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
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
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 [email protected]