# Gestione eccezioni -\> best practice

**URL:** <https://www.ruby-forum.com/t/gestione-eccezioni-best-practice/173165>\
**Category:** IT\
**Created:** [August 4, 2009, 9:34am UTC](https://www.ruby-forum.com/t/gestione-eccezioni-best-practice/173165 "2009-08-04T09:34:18Z")\
**Posts on this page:** 9\
**Page:** 1

<div class="post-metadata">

**Author:** ![bl4d3](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/b/b3f665/32.png) [@bl4d3](https://www.ruby-forum.com/u/bl4d3)\
**Post date:** [August 4, 2009, 9:34am UTC](https://www.ruby-forum.com/t/gestione-eccezioni-best-practice/173165/1 "2009-08-04T09:34:18Z")

</div>

Ciao,  
Ã¨ il mio primo post qui (ciao a tutti 🙂 ) e non uso ror da molto, mi  
chiedevo qual’era il metodo migliore per gestire le eccezioni che si  
verificano ad esempio quando si riscontrano errori nelle operazioni sul  
db(record non trovati etc…) o errori di routing, ho letto della  
possibilitÃ di fare l’override del metodo rescue\_action\_in\_public nel  
mio application.rb in questo modo:

def rescue\_action\_in\_public(exception)  
render :template =\> ‘error’  
end

cos’altro dovrei tenere presente? Ci sono controindicazioni nel farlo?

Grazie per i chiarimenti

---

<div class="post-metadata">

**Author:** ![bl4d3](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/b/b3f665/32.png) [@bl4d3](https://www.ruby-forum.com/u/bl4d3)\
**Post date:** [August 4, 2009, 11:23am UTC](https://www.ruby-forum.com/t/gestione-eccezioni-best-practice/173165/2 "2009-08-04T11:23:54Z")

</div>

Grazie della dritta, ma non ho ancora ben chiaro come gestire le  
eccezione del tipo ActiveRecord::RecordNotFound o  
ActiveRecord::RecordInvalid…in questo caso mi basterebbe segnalare che  
qualcosa Ã¨ andato storto all’utente, come potrei fare?  
Grazie

---

<div class="post-metadata">

**Author:** ![bl4d3](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/b/b3f665/32.png) [@bl4d3](https://www.ruby-forum.com/u/bl4d3)\
**Post date:** [August 4, 2009, 11:01am UTC](https://www.ruby-forum.com/t/gestione-eccezioni-best-practice/173165/3 "2009-08-04T11:01:26Z")

</div>

Mattia L. wrote:

> cos’altro dovrei tenere presente? Ci sono controindicazioni nel farlo?
> 
> Grazie per i chiarimenti

Ciao,  
secondo me “best practice” Ã¨ molto soggettivo, ti posso dire come piace  
a me gestire le “bad request” tramite routing:

come ultima riga, dopo le ultime due routes generiche inserisci:

#config\routes.rb  
map.connect ‘:controller/:action/:id’  
map.connect ‘:controller/:action/:id.:format’  
map.catch\_all “\*anything” , :controller =\> “home” , :action =\>  
“unknown\_request”

nell’esempio si indirizza la bad request nel controller home dove per  
esempio si puÃ² mostrare un messaggio e reindirizzare alla root:

#app\controllers\home\_controller.rb  
def unknown\_request  
respond\_to do |format|  
format.html do  
flash[:error] = I18n.t :unknown\_request  
redirect\_to root\_path  
end  
format.xml { render :xml =\> {:root =\> I18n.t(:unknown\_request) },  
:status =\> :unprocessable\_entity }  
format.js  
end  
end

oppure se rindirizzare alla root non ti piace puoi scegliere di  
indirizzarlo al suo precedente url o se non esiste alla 404:

page = Page.find\_by\_old\_page(request.request\_uri)  
if page  
redirect\_to page.new\_page  
else  
render :file =\> “#{RAILS\_ROOT}/public/404.html”, :layout =\> false,  
:status =\> 404  
end

Ciao

---

<div class="post-metadata">

**Author:** ![bl4d3](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/b/b3f665/32.png) [@bl4d3](https://www.ruby-forum.com/u/bl4d3)\
**Post date:** [August 4, 2009, 11:39am UTC](https://www.ruby-forum.com/t/gestione-eccezioni-best-practice/173165/4 "2009-08-04T11:39:17Z")

</div>

Personalmente uso le eccezioni molto spesso.  
Li preferisco anche all’uso dei vari if nelle azioni CRUD.

Ecco un esempio che dovrebbe rispondere anche alla tua domanda.

def create  
@domain = Domain.new(params[:domain])  
@domain.save!

flash[:notice] = ‘Domain was successfully created’  
respond\_to do |format|  
format.html { redirect\_to(@domain) }  
format.xml { render :xml =\> @domain, :status =\> :created, :location  
=\>  
@domain }  
end

rescue ActiveRecord::RecordInvalid  
respond\_to do |format|  
format.html { render :action =\> “new” }  
format.xml { render :xml =\> @domain.errors, :status =\>  
:unprocessable\_entity }  
end  
end

Ecco un esempio invece più complesso che usa anche il rescue\_from.

class MyController \< ApplicationController

rescue\_from RoboNet::Whois::Error, :with =\> :error  
rescue\_from Hostname::InvalidHostnameError, :with =\> :error

def run  
@hostname = Hostname.fetch(params[:qstring])  
@response = @hostname.query\_whois

```
respond_to do |format|
  format.html
  format.js { render :layout => false }
end

```

rescue Timeout::Error  
raise RoboNet::Whois::Error, “Execution timed out. The server tooks  
to  
long to respond.”

# TODO: move into RoboNet class to avoid re-thrown

rescue ::Whois::Error =\> e  
raise RoboNet::Whois::Error, e.message  
end

end

Sono esempi live estratti da reali applicazioni, consiglio di vedere la  
logica più che il codice in  
sé.Il secondo caso merita particolare attenzione perché sfrutta decisamente a  
fondo il sistema di convenzioni built-in in Rails.

– Simone

2009/8/4 Mattia L. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)

> [http://lists.ruby-it.org/mailman/listinfo/ml](http://lists.ruby-it.org/mailman/listinfo/ml)

–  
Simone C.

Site & Blog: [http://www.simonecarletti.com](http://www.simonecarletti.com)  
Email: removed\_email\_address@domain.invalid  
LinkedIn: [http://linkedin.com/in/weppos](http://linkedin.com/in/weppos)  
Nick: weppos | Skype: weppos

---

<div class="post-metadata">

**Author:** ![bl4d3](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/b/b3f665/32.png) [@bl4d3](https://www.ruby-forum.com/u/bl4d3)\
**Post date:** [August 5, 2009, 3:59pm UTC](https://www.ruby-forum.com/t/gestione-eccezioni-best-practice/173165/5 "2009-08-05T15:59:32Z")

</div>

Sergio wrote:

> Qualcuno ha una spiegazione ???  
> Credo sia il percorso delle librerie di mysql.
> 
> Grazie per suggerimenti,  
> Saluti,  
> Sergio.

Prima dovresti spiegare che c’entra col topic. Comunque sembra che non  
hai niente sul tuo sistema per compilare sorgenti in c

---

<div class="post-metadata">

**Author:** ![bl4d3](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/b/b3f665/32.png) [@bl4d3](https://www.ruby-forum.com/u/bl4d3)\
**Post date:** [August 5, 2009, 3:17pm UTC](https://www.ruby-forum.com/t/gestione-eccezioni-best-practice/173165/6 "2009-08-05T15:17:39Z")

</div>

non riesco ad installare gem install mysql su xp !!!

comando: gem install mysql

errore: \>\>\>\>\>\>\>

C:\Documents and Settings\Sergio\>gem install mysql  
Building native extensions. This could take a while…  
ERROR: Error installing mysql:  
ERROR: Failed to build gem native extension.

c:/ruby191/bin/ruby.exe extconf.rb  
checking for mysql\_query() in -lmysqlclient… \*\*\* extconf.rb failed \*\*\*  
Could not create Makefile due to some reason, probably lack of  
necessary libraries and/or headers. Check the mkmf.log file for more  
details. You may need configuration options.

Provided configuration options:  
–with-opt-dir  
–without-opt-dir  
–with-opt-include  
–without-opt-include=${opt-dir}/include  
–with-opt-lib  
–without-opt-lib=${opt-dir}/lib  
–with-make-prog  
–without-make-prog  
–srcdir=.  
–curdir  
–ruby=c:/ruby191/bin/ruby  
–with-mysql-config  
–without-mysql-config  
–with-mysql-dir  
–without-mysql-dir  
–with-mysql-include  
–without-mysql-include=${mysql-dir}/include  
–with-mysql-lib  
–without-mysql-lib=${mysql-dir}/lib  
–with-mysqlclientlib  
–without-mysqlclientlib  
c:/ruby191/lib/ruby/1.9.1/mkmf.rb:362:in `try_do': The complier failed to genera te an executable file. (RuntimeError) You have to install development tools first. from c:/ruby191/lib/ruby/1.9.1/mkmf.rb:415:in`try\_link0’  
from c:/ruby191/lib/ruby/1.9.1/mkmf.rb:419:in `try_link' from c:/ruby191/lib/ruby/1.9.1/mkmf.rb:527:in`try\_func’  
from c:/ruby191/lib/ruby/1.9.1/mkmf.rb:748:in `block in find_library' from c:/ruby191/lib/ruby/1.9.1/mkmf.rb:668:in`block in  
checking\_for’  
from c:/ruby191/lib/ruby/1.9.1/mkmf.rb:274:in `block (2 levels) in postp one' from c:/ruby191/lib/ruby/1.9.1/mkmf.rb:248:in`open’  
from c:/ruby191/lib/ruby/1.9.1/mkmf.rb:274:in `block in postpone' from c:/ruby191/lib/ruby/1.9.1/mkmf.rb:248:in`open’  
from c:/ruby191/lib/ruby/1.9.1/mkmf.rb:270:in `postpone' from c:/ruby191/lib/ruby/1.9.1/mkmf.rb:667:in`checking\_for’  
from c:/ruby191/lib/ruby/1.9.1/mkmf.rb:744:in `find_library' from extconf.rb:14:in`’

Gem files will remain installed in  
c:/ruby191/lib/ruby/gems/1.9.1/gems/mysql-2.7  
for inspection.  
Results logged to  
c:/ruby191/lib/ruby/gems/1.9.1/gems/mysql-2.7/gem\_make.out

C:\Documents and Settings\Sergio\>

Qualcuno ha una spiegazione ???  
Credo sia il percorso delle librerie di mysql.

Grazie per suggerimenti,  
Saluti,  
Sergio.

---

<div class="post-metadata">

**Author:** ![bl4d3](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/b/b3f665/32.png) [@bl4d3](https://www.ruby-forum.com/u/bl4d3)\
**Post date:** [August 5, 2009, 6:35pm UTC](https://www.ruby-forum.com/t/gestione-eccezioni-best-practice/173165/7 "2009-08-05T18:35:00Z")

</div>

Sergio wrote:

> Forse non ho le idee ben chiare comunque: :-[

No scusa, non serve a nulla installare il compilatore c++ ho provato in  
una macchina virtuale e non Ã¨ cambiato nulla, eppure da esperienze  
precedenti… vabbÃ¨  
Comunque scarica la gemma  
[http://rubyforge.org/frs/?group\_id=1598&release\_id=8668](http://rubyforge.org/frs/?group_id=1598&release_id=8668) e installala in  
locale, cosÃ¬ dovrebbe funzionare. Se te la scarica come .tar rinominala  
in .gem, non so perchÃ¨ ha quell’estensione.

---

<div class="post-metadata">

**Author:** ![bl4d3](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/b/b3f665/32.png) [@bl4d3](https://www.ruby-forum.com/u/bl4d3)\
**Post date:** [August 5, 2009, 4:35pm UTC](https://www.ruby-forum.com/t/gestione-eccezioni-best-practice/173165/8 "2009-08-05T16:35:32Z")

</div>

Forse non ho le idee ben chiare comunque: :-[

1. windows xp con ruby 1.9.1-p129, rails 2.3.3
2. ho installato mysql 5.0 che funziona correttamente.
3. per esercizio ho creato un “prova” di questo tipo: rails prova -d  
mysql
4. dando il comando rake db:create mi dice che devo installare mysql
5. gem install mysql mi da’ il messaggio che ho postato

Non trovo spiegazioni in merito nei vari forum. :-[

P.S. se creo il tutto con sqlite funziona nel senso che l’installazione  
della gemma sqlite3 va a buon fine 🙂

Grazie, per eventuali ulteriori chiarimenti.

Marco M. wrote:

> Prima dovresti spiegare che c’entra col topic. Comunque sembra che non  
> hai niente sul tuo sistema per compilare sorgenti in c

–  
Sergio D.  
Denver srl - Dronero  
tel 0171 911383 fax 0171 911387  
[mailto:removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)  
[www.denverbike.com](http://www.denverbike.com)

AVVERTENZE AI SENSI DEL DECRETO LGS. 196/2003 SULLA PRIVACY.

Le informazioni contenute in questo messaggio di posta elettronica e/o  
nel/i file/s allegato/i, sono da considerarsi strettamente riservate.  
Il loro utilizzo è consentito esclusivamente al destinatario del  
messaggio, per le finalità indicate nel messaggio stesso. Qualora  
riceveste questo messaggio senza esserne il destinatario, Vi preghiamo  
cortesemente di darcene notizia via e-mail e procedere alla  
distruzione del messaggio stesso, cancellandolo dal Vostro sistema;  
costituisce comportamento contrario ai principi dettati dal Decreto Lgs.  
196/2003 il trattenere il messaggio stesso, divulgarlo anche in parte,  
distribuirlo ad altri soggetti, copiarlo, od utilizzarlo per  
finalità diverse.

This electronic mail transmission may contain confidential information  
addressed only to the person(s) named. Any use, distribution, copying or  
disclosure by any other person and/or entities other than the intended  
recipient is prohibited (D.lgs 196/2003). If you received this  
transmission in error, please inform the sender immediately and delete  
the material.

---

<div class="post-metadata">

**Author:** ![bl4d3](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/b/b3f665/32.png) [@bl4d3](https://www.ruby-forum.com/u/bl4d3)\
**Post date:** [August 5, 2009, 7:23pm UTC](https://www.ruby-forum.com/t/gestione-eccezioni-best-practice/173165/9 "2009-08-05T19:23:31Z")

</div>

Ho scaricato in locale la gemma e ho installato correttamente.  
Molto probabilmente non riusciva a trovare la gemma sul repository, e mi  
dava quel po po di errore 🙂

Grazie per il tuo interessamento.

Saluti, Sergio.

Marco M. wrote:

> in .gem, non so perchè ha quell’estensione.

–  
Sergio D.  
Denver srl - Dronero  
tel 0171 911383 fax 0171 911387  
[mailto:removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)  
[www.denverbike.com](http://www.denverbike.com)

AVVERTENZE AI SENSI DEL DECRETO LGS. 196/2003 SULLA PRIVACY.

Le informazioni contenute in questo messaggio di posta elettronica e/o  
nel/i file/s allegato/i, sono da considerarsi strettamente riservate.  
Il loro utilizzo è consentito esclusivamente al destinatario del  
messaggio, per le finalità indicate nel messaggio stesso. Qualora  
riceveste questo messaggio senza esserne il destinatario, Vi preghiamo  
cortesemente di darcene notizia via e-mail e procedere alla  
distruzione del messaggio stesso, cancellandolo dal Vostro sistema;  
costituisce comportamento contrario ai principi dettati dal Decreto Lgs.  
196/2003 il trattenere il messaggio stesso, divulgarlo anche in parte,  
distribuirlo ad altri soggetti, copiarlo, od utilizzarlo per  
finalità diverse.

This electronic mail transmission may contain confidential information  
addressed only to the person(s) named. Any use, distribution, copying or  
disclosure by any other person and/or entities other than the intended  
recipient is prohibited (D.lgs 196/2003). If you received this  
transmission in error, please inform the sender immediately and delete  
the material.
