# Intercettare eccezioni esterne

**URL:** <https://www.ruby-forum.com/t/intercettare-eccezioni-esterne/187243>\
**Category:** IT\
**Created:** [April 20, 2010, 2:51pm UTC](https://www.ruby-forum.com/t/intercettare-eccezioni-esterne/187243 "2010-04-20T14:51:38Z")\
**Posts on this page:** 8\
**Page:** 1

<div class="post-metadata">

**Author:** ![daneel\_olivaw](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/58f4c7/32.png) [@daneel\_olivaw](https://www.ruby-forum.com/u/daneel_olivaw)\
**Post date:** [April 20, 2010, 2:51pm UTC](https://www.ruby-forum.com/t/intercettare-eccezioni-esterne/187243/1 "2010-04-20T14:51:38Z")

</div>

Buongiorno lista.  
Sto creando la gestione dell’importazione ed esportazione del database  
(per backup, restore o altro) dal mio programmino in ruby e gtk.  
Non trovando di meglio e dal basso della mia ignoranza, ho pensato di  
usare direttamente mysqldump, quindi il codice Ã¨ una cosa del genere:

[creazione della maschera di richiesta password database]  
…  
password = Gtk::Entry.new #entry in cui scrivere la password  
bottoneok = Gtk::Button.new( “OK” ) #bottone da premere per far  
partire l’operazione  
…

bottoneok.signal\_connect( “clicked” ) {  
if password.text == “”  
Avviso.avviso(mesportadb, “Password sbagliata”)  
else  
system(“mysqldump -u nomeutente -p’#{password.text}’ database \>  
./esportadb/database.sql 2\> errore.txt”)  
if File.size(“errore.txt”) != 0  
Avvisoprova.avviso(mesportadb, “Password sbagliata”)  
File.delete(“errore.txt”)  
password.text = “”  
else  
Conferma.conferma(mesportadb, “Database esportato correttamente”)  
File.delete(“errore.txt”)  
mesportadb.destroy #maschera in cui Ã¨ chiesta la password  
end  
end  
}

Come potete vedere, l’eccezione di password sbagliata Ã¨ gestita facendo  
creare un file contenente l’output error di mysqldump e guardando se Ã¨  
vuoto ( = tutto bene, nessun errore) o meno (c’Ã¨ stato un errore), che  
poi viene cancellato quando non serve piÃ¹.

C’Ã¨ un sistema piÃ¹ elegante per gestire le eccezioni delle applicazioni  
esterne? Ho provato a dare un’occhiata al sistema “begin … rescue”, ma  
se si puÃ² non ho capito come…

Grazie.

---

<div class="post-metadata">

**Author:** ![daneel\_olivaw](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/58f4c7/32.png) [@daneel\_olivaw](https://www.ruby-forum.com/u/daneel_olivaw)\
**Post date:** [April 20, 2010, 3:07pm UTC](https://www.ruby-forum.com/t/intercettare-eccezioni-esterne/187243/2 "2010-04-20T15:07:43Z")

</div>

On Tuesday 20 April 2010 14:51:38 Daneel O. wrote:

> C’è un sistema più elegante per gestire le eccezioni delle applicazioni  
> esterne? Ho provato a dare un’occhiata al sistema “begin … rescue”, ma  
> se si può non ho capito come…

Controlla il valore d’uscita del programma che chiami.  
La chiamata system restituisce true se tutto e’ andato per il verso  
giusto,  
false altrimenti.

Oppure puoi invocare il comando usando un’altra chiamata e controllare  
lo  
stderr.

Ti consiglio di leggere questa pagina [1]

Ciao  
Flavio

[1] [http://whynotwiki.com/Ruby\_/\_Process\_management](http://whynotwiki.com/Ruby_/_Process_management)

---

<div class="post-metadata">

**Author:** ![daneel\_olivaw](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/58f4c7/32.png) [@daneel\_olivaw](https://www.ruby-forum.com/u/daneel_olivaw)\
**Post date:** [April 20, 2010, 3:10pm UTC](https://www.ruby-forum.com/t/intercettare-eccezioni-esterne/187243/3 "2010-04-20T15:10:38Z")

</div>

Il 20 aprile 2010 14.51, Daneel O. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) ha  
scritto:

> system(“mysqldump -u nomeutente -p’#{password.text}’ database \>  
> ./esportadb/database.sql 2\> errore.txt”)  
> if File.size(“errore.txt”) != 0

Ciao,  
intanto puoi usare `` invece di system:

files = `ls`  
ora files contiene, ad esempio,  
“un\_file\nun\_altro\_file\nun\_altro\_file\_ancora\n”

Nel tuo caso, puoi usare msg = `mysqldump bla bla` e poi controllare  
la dimensione di msg.

Tuttavia c’è un modo migliore il valore di uscita (exit status) del  
comando:

msg = `mysqldump bla bla`

if $? == 0

# tutto bene

else  
…  
end

Probabilmente mysqldump dà più che semplicemente 0 o non 0, ma in  
questo momento non posso fare tentativi.

In quel caso potresti riuscire a gestire più di un caso,  
cioè:successo, password sbagliata, altri errori.

pietro

---

<div class="post-metadata">

**Author:** ![daneel\_olivaw](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/58f4c7/32.png) [@daneel\_olivaw](https://www.ruby-forum.com/u/daneel_olivaw)\
**Post date:** [April 20, 2010, 3:17pm UTC](https://www.ruby-forum.com/t/intercettare-eccezioni-esterne/187243/4 "2010-04-20T15:17:40Z")

</div>

On Tuesday 20 April 2010 15:10:32 Pietro G. wrote:

> intanto puoi usare `` invece di system:
> 
> files = `ls`  
> ora files contiene, ad esempio,  
> “un\_file\nun\_altro\_file\nun\_altro\_file\_ancora\n”
> 
> Nel tuo caso, puoi usare msg = `mysqldump bla bla` e poi controllare  
> la dimensione di msg.

Concordo, pero’ devi redirigere lo stderr sullo stdout:  
`mysqldump bla bla 2>&1`

Ciao  
Flavio

---

<div class="post-metadata">

**Author:** ![daneel\_olivaw](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/58f4c7/32.png) [@daneel\_olivaw](https://www.ruby-forum.com/u/daneel_olivaw)\
**Post date:** [April 20, 2010, 3:22pm UTC](https://www.ruby-forum.com/t/intercettare-eccezioni-esterne/187243/5 "2010-04-20T15:22:56Z")

</div>

Il 20 aprile 2010 15.17, Flavio C. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) ha  
scritto:

> Concordo, pero’ devi redirigere lo stderr sullo stdout:  
> `mysqldump bla bla 2>&1`

ops! hai ragione.

pietro

---

<div class="post-metadata">

**Author:** ![daneel\_olivaw](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/58f4c7/32.png) [@daneel\_olivaw](https://www.ruby-forum.com/u/daneel_olivaw)\
**Post date:** [April 22, 2010, 11:46am UTC](https://www.ruby-forum.com/t/intercettare-eccezioni-esterne/187243/6 "2010-04-22T11:46:54Z")

</div>

Pietro G. wrote:

> Il 20 aprile 2010 15.17, Flavio C. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) ha  
> scritto:
> 
> > Concordo, pero’ devi redirigere lo stderr sullo stdout:  
> > ï¿½`mysqldump bla bla 2>&1`
> 
> ops! hai ragione.
> 
> pietro

Grazie ad entrambi.  
Ora il ciclo Ã¨:

…  
if password.text == “”  
Avvisoprova.avviso(mesportadb, “Password sbagliata”)  
else  
comando = `mysqldump -u utente -p'#{password.text}' database > ./esportadb/database.sql 2>&1`  
puts $?  
if $? != 0  
puts “sbagliato”  
Avvisoprova.avviso(mesportadb, “Password sbagliata”)  
password.text = “”  
else  
Conferma.conferma(mesportadb, “Database esportato correttamente”)  
mesportadb.destroy  
end  
end  
…

Per la cronaca, su “comando” non finisce niente (un “puts comando” non  
dÃ nessun output), mentre $? assume valore 512 in caso di errore e 0 se  
va tutto bene. Comportamento corretto?

---

<div class="post-metadata">

**Author:** ![daneel\_olivaw](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/58f4c7/32.png) [@daneel\_olivaw](https://www.ruby-forum.com/u/daneel_olivaw)\
**Post date:** [April 22, 2010, 11:56am UTC](https://www.ruby-forum.com/t/intercettare-eccezioni-esterne/187243/7 "2010-04-22T11:56:46Z")

</div>

Il 22 aprile 2010 11.46, Daneel O. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) ha  
scritto:

> end  
> Per la cronaca, su “comando” non finisce niente (un “puts comando” non  
> dà nessun output), mentre $? assume valore 512 in caso di errore e 0 se  
> va tutto bene. Comportamento corretto?

In comando dovrebbe finirci quello che normalmente vedresti a schermo,  
in teoria…

Sul valore di uscita non so risponderti: ho guardato la manpage di  
mysqldump ma non mi sembra che spieghi se dettaglia gli errori.

Io farei delle prove, tipo:

- scrivere un nome di db inesistente;

- provare con senza server, o con server bloccato;

- altro che non mi viene in mente

per vedere se esistono altri possibili valori di uscita per errori  
diversi da “non autorizzato”, per rendere più robusta la tua  
applicazione.

pietro

---

<div class="post-metadata">

**Author:** ![daneel\_olivaw](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/58f4c7/32.png) [@daneel\_olivaw](https://www.ruby-forum.com/u/daneel_olivaw)\
**Post date:** [April 22, 2010, 2:47pm UTC](https://www.ruby-forum.com/t/intercettare-eccezioni-esterne/187243/8 "2010-04-22T14:47:08Z")

</div>

Pietro G. wrote:

> Il 22 aprile 2010 11.46, Daneel O. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) ha  
> scritto:
> 
> > ï¿½end  
> > Per la cronaca, su “comando” non finisce niente (un “puts comando” non  
> > dï¿½ nessun output), mentre $? assume valore 512 in caso di errore e 0 se  
> > va tutto bene. Comportamento corretto?
> 
> In comando dovrebbe finirci quello che normalmente vedresti a schermo,  
> in teoria…

Quello che penso anch’io.  
Ho fatto anche la procedura di importazione e…

comando = `mysql database < "#{file.sql}" -u utente -p'#{@password2.text}' 2>&1`  
puts comando

in questo caso “comando” contiene correttamente l’errore… vacci a  
capire…

> Sul valore di uscita non so risponderti: ho guardato la manpage di  
> mysqldump ma non mi sembra che spieghi se dettaglia gli errori.
> 
> Io farei delle prove, tipo:
> 
> - scrivere un nome di db inesistente;
> 
> - provare con senza server, o con server bloccato;
> 
> - altro che non mi viene in mente
> 
> per vedere se esistono altri possibili valori di uscita per errori  
> diversi da “non autorizzato”, per rendere piï¿½ robusta la tua  
> applicazione.

SÃ¬, confermo che i valori di $? cambiano in base all’errore, ora bisogna  
che trovi la voglia per mettermi a creare eccezioni e personalizzare i  
messaggi di avviso.
