500 Internal Server Error in Dancer


Mistakes can happen. There might be an exception somewhere in one of the routes. Don't worry though. If that happens Dancer will show a standard "500 Internal Error" page.

In our sample application the "/calc" route tries to make some calculation but a division by 0 error occures. This will trigger the "500 Internal Error".

Usually you don't plan to have certain URLs and certain input generate such error, so you probably will never write a test for this, but now, that we are showing it I put together one.

Later we'll see how can we change the content of this page to be branded to our site.


examples/dancer/hello_500/app.psgi
package App;
use Dancer2;

get '/' => sub {
    return 'Hello World!';
};

get '/calc' => sub {
    my $x = 1;
    my $y = 0;
    my $z = $x / $y;
    return 'OK';
};

App->to_app;

examples/dancer/hello_500/test.t
use strict;
use warnings;

use Test::More;
use Plack::Test;
use Plack::Util;
use HTTP::Request::Common;

my $app = Plack::Util::load_psgi './app.psgi';

my $test = Plack::Test->create($app);

subtest main => sub {
    my $res = $test->request(GET '/');
    is $res->status_line, '200 OK', 'Status';
    is $res->content, 'Hello World!', 'Content';
};

subtest calc => sub {
    my $res = $test->request(GET '/calc');
    is $res->status_line, '500 Internal Server Error', 'Status';
    like $res->content, qr{<title>Error 500 - Internal Server Error</title>};
    like $res->content, qr{Powered by <a href="http://perldancer.org/">Dancer2</a>};
};


done_testing();