Stiamo lentamente rifattorizzando la nostra grande applicazione Perl verso interfacce orientate agli oggetti, in particolare per i modelli di dati. La parte fastidiosa è che le tracce dello stack diventano meno utili. Per dare un esempio fabbricato: Prima.Come posso regolare il rendering degli oggetti in un longmess?
sub send_message {
my ($user_id, $message) = @_;
...
Carp::confess('test');
}
# output:
test at example.pm line 23
foo('42', 'Hello World') called at example.pl line 5
Dopo.
sub send_message {
my ($user, $message) = @_;
...
Carp::confess('test');
}
# output:
test at example.pm line 23
foo('MyApp::Model::User=HASH(0x2c94f68)', 'Hello World') called at example.pl line 5
Così ora non riesco a vedere quale utente è stata passata al foo()
, vedo solo il nome della classe (che è già documentata) e qualche indirizzo di memoria di un oggetto.
Ho provato ad installare un operatore di stringa su classe del modello utilizzando overload.pm:
use overload ('""' => \&stringify);
sub stringify {
my ($self) = @_;
return sprintf '%s[id=%d]', ref($self), $self->id;
}
Ma questo non pregiudica il longmess. Quello che vorrei è qualcosa di simile:
test at example.pm line 23
foo('MyApp::Model::User[id=42]', 'Hello World') called at example.pl line 5
Cioè, il primo parametro da foo()
deve essere visualizzato utilizzando il metodo dell'oggetto stringify()
. Come posso ottenerlo?
Sembra che tu desideri la tua funzione ['die()'] (http://perldoc.perl.org/functions/die.html) in cui implementerai il tuo backtrace che chiama 'stringify()' sul tuo oggetti. Credo che tu possa implementare la tua funzione 'die()' usando l'hook '$ SIG {__ DIE __}'. –
@PP. '$ SIG {__ DIE __}' è discutibilmente rotto. Per favore non usarlo. Quel gestore è pensato per essere chiamato come l'ultima cosa prima che il programma esca dopo un 'die', non come un gancio per modificare la formattazione dei messaggi di errore. Si potrebbe sovrascrivere 'CORE :: GLOBAL :: die', o 'use subs' die'' per implementare un' die' personalizzato. Inoltre, si tratta di 'Carp :: confess', non' die'. – amon