#24 The Stack Trace
Durante lo sviluppo di applicazioni Rails capita talvolta di imbattersi in pagine come questa:
La pagina di errore che mostra lo stack trace.
Oltra al messagio di errore corrente, la pagina di errore mostra anche lo stack trace. Lo stack trace può incutere timore le prime volte, ma è in grado di fornirci informazioni fondamentali su ciò che ha causato l’errore nell’applicazione (si noti che nella pagina precedente sono state tolte molte linee dello stack trace). Fra poco esamineremo per bene lo stack trace per fare il debug della nostra applicazione. Prima però, cercheremo di spiegare esattamente cos’è lo stack trace.
Cos’è uno stack trace?
Per visualizzare uno stack trace, abbiamo bisogno di aprire irb
, la console interattiva di Ruby. Lo stack trace viene mostrato ogniqualvolta sia sollevato un errore, per cui, solleviamone uno:
>> raise "test error" RuntimeError: test error from (irb):1 >>
Lo stack trace in questo caso è corto, solo una linea. Ora solleveremo un errore all’interno di un metodo:
>> def foo >> raise "test error" >> end => nil >> foo RuntimeError: test error from (irb):3:in `foo’ from (irb):5 >>
Quando richiamiamo il metodo, compare lo stack trace. Se definiamo un ulteriore metodo che richiama foo
, vedremmo anche quest’ultimo comparire sullo stack trace:
>> def bar >> foo >> end => nil >> bar RuntimeError: test error from (irb):3:in `foo’ from (irb):7:in `bar’ from (irb):9 >>
bar
chiama foo
che solleva l’errore e si può vedere ogni metodo nello stack trace. Lo stack trace in una pagina di errore Rails funziona allo stesso modo. Ridiamo un’occhiata allo stack trace iniziale ora e cerchiamo di sistemare il codice.
Debugging del codice
Sono qui riportate le prime linee dello stack trace:
/Library/Ruby/Gems/1.8/gems/activerecord-2.2.2/lib/active_record/base.rb:2578:in ‘attributes=’ /Library/Ruby/Gems/1.8/gems/activerecord-2.2.2/lib/active_record/base.rb:2283:in ‘initialize’ app/controllers/tasks_controller.rb:7:in ‘new’ app/controllers/tasks_controller.rb:7:in ‘show’
Il primo paio di righe non ci sono di grande utilità, perchè mostrano solo in che punto dell’esecuzione del codice di framework ci si trovava quando è avvenuto l’errore. Il nostro errore molto probabilmente non si trova lì, tuttavia. Le due righe dopo mostrano l’errore apparso nel nostro controller dei task, nel metodo new che è chiamato da show
. Diamo uno sguardo a quel codice e vediamo se viene fuori il problema:
class TasksController < ApplicationController def index @tasks = Task.find(:all, :include => :project) end def show @task = Task.new(params[:id]) end end
I metodi del TaskController
, incluso l’errore nel metodo show
.
L’errore è nel metodo show
. Avremmo dovuto scrivere Task.find
invece di Task.new
. Correggiamo il metodo e ricarichiamo la pagina:
Funziona! Ispezionare lo stack trace ci ha dato una mano a capire e risolvere il nostro problema. C’è un ultimo trucco che possiamo usare per fare del debug delle nostre applicazioni. Un plugin Rails chiamato Footnotes trasforma le righe dello stack trace in collegamenti cliccabili che aprono i file opportuni in TextMate. Per installarlo, lanciate il seguente comando dalla root della cartella della vostra applicazione (occorre che abbiate git installato sulla vostra macchina):
git clone git://github.com/drnic/rails-footnotes.git vendor/plugins/footnotes rm -rf vendor/plugins/footnotes/.git
Ora è sufficiente cliccare la riga dello stack trace e immediatamente vedremo il contenuto del file in TextMate che ci permetterà di identificare in maniera ancora più semplice gli errori.