Intercettare eccezioni esterne

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.

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

Il 20 aprile 2010 14.51, Daneel O. [email protected] 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

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

Il 20 aprile 2010 15.17, Flavio C. [email protected] ha
scritto:

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

ops! hai ragione.

pietro

Pietro G. wrote:

Il 20 aprile 2010 15.17, Flavio C. [email protected] 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?

Il 22 aprile 2010 11.46, Daneel O. [email protected] 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

Pietro G. wrote:

Il 22 aprile 2010 11.46, Daneel O. [email protected] 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.