Gestione eccezioni -> best practice

Ciao,
è il mio primo post qui (ciao a tutti :slight_smile: ) 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

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

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

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. [email protected]

http://lists.ruby-it.org/mailman/listinfo/ml


Simone C.

Site & Blog: http://www.simonecarletti.com
Email: [email protected]
LinkedIn: http://linkedin.com/in/weppos
Nick: weppos | Skype: weppos

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

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:intry_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:intry_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:inblock 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:inopen’
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:inopen’
from c:/ruby191/lib/ruby/1.9.1/mkmf.rb:270:in postpone' from c:/ruby191/lib/ruby/1.9.1/mkmf.rb:667:inchecking_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.

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 e installala in
locale, così dovrebbe funzionare. Se te la scarica come .tar rinominala
in .gem, non so perchè ha quell’estensione.

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 :slight_smile:

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:[email protected]
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.

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 :slight_smile:

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:[email protected]
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.