[Dancer-users] why does "warn" fail?

Flavio Poletti polettix at gmail.com
Sat Jan 22 21:53:06 CET 2011


Hi,

   there are different topics involved here.

The first one regards the version of Dancer you're running. I tried to start
a sample application with "dancer -a Whatever" and added a warn call in the
only route handler, but did not get your error. I ran my example with Dancer
1.2002 and the result was the error I expected, which leads us to the
following point.

The second topic deals with warnings promoted to fatal errors. This is
triggered by the "warnings" setting, whose documentation is in
Dancer::Config. This setting is enabled by default in the "development"
environment, so you should turn this off to get rid of the errors. From what
I understood, this is meant to be a useful feature to ensure that you don't
get warnings from modules, etc. which you might want to catch as soon as
you're in the development process.

About your muscle memory, if you want to use "warn" instead of "warning" I
think that your best option is to propose a patch which I suppose could be
developed along the following lines:

* read how to contribute to the project in
https://github.com/sukria/Dancer/blob/devel/lib/Dancer/Development.pod

* add a configuration option "warn_as_warning" in lib/Dancer/Config.pm

* use this configuration option in lib/Dancer/Route.pm subroutine "execute"
like this:
# -------------------------------------
 sub execute {
     my ($self) = @_;

-    if (Dancer::Config::setting('warnings')) {
+    if (Dancer::Config::setting('warn_as_warning')) {
+      local $SIG{__WARN__} = \&Dancer::Logger::warning;
+      return $self->code->();
+    }
+    elsif (Dancer::Config::setting('warnings')) {
         my $warning;
         local $SIG{__WARN__} = sub { $warning = $_[0] };
         my $content = $self->code->();
# -------------------------------------

* write tests

Anyway, separating how you send warnings in your web application from how
you (or others) do that in the modules you use might be very useful to
detect problems early... a good reason to teach something new to your muscle
memory!

Cheers,

    Flavio.



On Sat, Jan 22, 2011 at 2:08 AM, Brian E. Lozier <brian at massassi.com> wrote:

> As a perl veteran I am used to using the built-in "warn" function to
> write to STDERR.  Under mod_perl/Apache this prints to the web
> server's error log.  Using my dancer app like this:
>
> plackup -L Shotgun app.pl
>
> If I have a "warn" anywhere in my app, I get an error message:
>
> Error trace
>
> status code needs to be an integer greater than or equal to 100 at
> /usr/local/lib/perl5/site_perl/5.12.2/Plack/Middleware/StackTrace.pm
> line 27
>
> However, if I print STDERR "msg"; that works.  My question is: what
> happened to warn?  Can it be fixed so that it writes to STDERR instead
> of triggering an error message?
>
> I know about the "warning" function but it's really hard to change 10
> years of muscle memory!
>
> Thanks,
> Brian
> _______________________________________________
> Dancer-users mailing list
> Dancer-users at perldancer.org
> http://www.backup-manager.org/cgi-bin/listinfo/dancer-users
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.backup-manager.org/pipermail/dancer-users/attachments/20110122/28fd0161/attachment.htm>


More information about the Dancer-users mailing list