2011/8/17 Gunnar Strand <gurra.str...@gmail.com> > Hi, > > I am having problems getting error back from POE. > > Sorry for keeping this a tad short, but in this excerpt, I have a > Server::TCP component with this ClientConnected data: > > POE::Component::Server::TCP > ->new( > Alias => 'server', > Port => $port_start, > ClientFilter => 'POE::Filter::Reference', > > SessionParams => [ options => { debug => $debug, > trace => $trace_poe } ], > * ClientConnected => \&Smed::Net::Server::client_connected,* > ClientDisconnected => \&Smed::Net::Server::client_disconnected, > ClientInput => \&Smed::Net::Server::handle_message, > ClientError => sub { > my ($syscall_name, $error_num, $error_str) = @_[ARG0..ARG2]; > warn "CLIENT ERROR: $syscall_name: $error_str"; > }, > > ClientShutdownOnError => 1, > > InlineStates => { > status => > sub { > $_[HEAP]->{client} > ->put( Smed::Message->new( action => 'status', > data => $_[ARG0] )) > }, > }, > ); > [...] > > and important parts of Smed::Net::Server look like: > > use strict; > use warnings; > > #use Log::Trace; > use POE; > > [...] > > sub client_connected { > warn "SESSION: ", $_[SESSION]->ID; > TRACE( 'Client ' . $_[SESSION]->ID . ' connected' ); > } > > When a client connects, the "client_connected" sub is called, but is > immediately disconnected (since TRACE is undefined). "Log::Trace" is > commented out as you can see, to show that I had originally forgotten to add > it to the file. But there is no error message from POE that "TRACE" is > undefined(!) when this code is executed, it just silently disconnects the > client and shuts down the TCP server with it. If I add "use Log::Trace;" > then the application works as expected. > > I tried to reproduce this in a minimalistic fashion: > > *nettest.pl:* > #!/usr/bin/perl > > use warnings; > use strict; > > use Log::Trace; > use Net; > > use POE qw(Component::Server::TCP); > > POE::Component::Server::TCP > ->new( > Port => 12345, > SessionParams => [ options => { debug => 1, trace => 1 } ], > ClientConnected => \&Net::client_connected, > ClientInput => sub { > my $client_input = $_[ARG0]; > $client_input =~ tr[a-zA-Z][n-za-mN-ZA-M]; > $_[HEAP]{client}->put($client_input); > }, > ); > > POE::Kernel->run; > exit; > > *Net.pm:* > package Net; > > use strict; > use warnings; > > use POE; > > sub client_connected { > TRACE( 'Client ' . $_[SESSION]->ID . ' connected' ); > } > > 1; > > In this case POE happily aborts and reports the error: > > Undefined subroutine &Net::TRACE called at Net.pm line 9. > > I am certain that I am the culprit here :-), but I have not been able to > determine what I can have done to cause this behavior. I can continue with > the prorgam now that I know what the error is, but I would really like to > avoid running into this again. > > BR > Gunnar > > Never got my mail from the list, but I hope replying to my original mail puts it in the thread.
A tip on the IRC channel sugggested me to do: POE_CATCH_EXCEPTIONS=0 ./bin/smed which caused the error to be generated by POE, just as in the small test case. I don't know anything about POE internals, but perhaps the internal flag for catching exceptions has been turned on somehow? Gunnar