Powielamy powoli naszą dużą aplikację Perla w kierunku interfejsów obiektowych, szczególnie w przypadku modeli danych. Denerwujące jest to, że ślady stosu stają się mniej przydatne. Aby dać sfabrykowany przykład: Przed.Jak mogę dopasować renderowanie obiektów w długim czasie?
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
Po.
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
Więc teraz nie mogę zobaczyć, które użytkownik został przekazany do foo()
, tylko widzę nazwę klasy (co już jest udokumentowane), a niektóre adres pamięci obiektu.
Próbowałem zainstalować operator stringification od klasy modelu za pomocą overload.pm:
use overload ('""' => \&stringify);
sub stringify {
my ($self) = @_;
return sprintf '%s[id=%d]', ref($self), $self->id;
}
Ale to nie ma wpływu na longmess. Chciałbym coś takiego:
test at example.pm line 23
foo('MyApp::Model::User[id=42]', 'Hello World') called at example.pl line 5
Oznacza to, że pierwszy parametr do foo()
powinny być wyświetlane przy użyciu stringify()
metody obiektu. Jak mogę to osiągnąć?
Wygląda na to, że chcesz mieć własną funkcję '' die() '] (http://perldoc.perl.org/functions/die.html), w której możesz zaimplementować swój własny ślad, który wywołuje' stringify() 'na twoim obiekty. Wierzę, że możesz zaimplementować własną funkcję 'die()' używając '$ SIG {__ DIE __}' hook. –
@PP. '$ SIG {__ DIE __}' jest prawdopodobnie uszkodzony. Proszę go nie używać. Ten program obsługi ma być wywołany jako ostatnia rzecz przed wyjściem programu po "umieraniu", a nie jako haczyk do modyfikowania formatowania komunikatów o błędach. Można zastąpić 'CORE :: GLOBAL :: die' lub' use subs 'die'', aby zaimplementować niestandardową 'die'. Dotyczy to także 'Carp :: confess', a nie' die'. – amon