src/TwigEnv.php
private function error(Twig_Error $err, $isPage=false, $templateString=null)
    {
        if (!$this->debug) {
            if (!$isPage) return '';
            // Debug mode off: show the site's error page
            try {
                $kirby = Kirby::instance();
                $page = $kirby->site()->page($kirby->get('option', 'error'));
                if ($page) return $kirby->render($page);
            }
            // avoid loops
            catch (Twig_Error $err2) {
            }
            // Error page didn't exist or was buggy: rethrow the initial error
            // Can result in the 'fatal.php' white error page (in Kirby 2.4+
            // with Whoops active), or an empty response (white page).
            // That’s consistent with errors for e.g. missing base templates.
            throw $err;
        }

        // Gather information
        $name = $err->getTemplateName();
        $line = $err->getTemplateLine();
        $msg  = $err->getRawMessage();
        $path = null;
        $code = $templateString ? $templateString : '';
        if (!$templateString) {
            try {
                $source = $this->twig->getLoader()->getSourceContext($name);
                $path = $source->getPath();
                $code = $source->getCode();
            }
            catch (Twig_Error $err2) {}
        }

        // When returning a HTML fragment
        if (!$isPage && $this->debug) {
            $info = get_class($err) . ', line ' . $line . ' of ' .
                ($templateString ? 'template string:' : $name);
            $src  = $this->getSourceExcerpt($code, $line, 1, false);
            return '<b>Error:</b> ' . $info . "\n" .
                '<pre style="margin:0">'.$src.'</pre>' . "\n" .
                '➡ ' . $msg . "<br>\n";
        }

        // When rendering a full page with Twig: make a custom error page
        // Note for Kirby 2.4+: we don't use the Whoops error page because
        // it's not possible to surface Twig source code in it's stack trace
        // and code viewer. Whoops will only show the PHP method calls going
        // in in the Twig library. That's a know — but unresolved — issue.
        // https://github.com/filp/whoops/issues/167
        // https://github.com/twigphp/Twig/issues/1347
        // So we roll our own.
        $html = Tpl::load(__DIR__ . '/errorpage.php', [
            'title' => get_class($err),
            'subtitle' => 'Line ' . $line . ' of ' . ($path ? $path : $name),
            'message' => $msg,
            'code' => $this->getSourceExcerpt($code, $line, 6, true)
        ]);
        return new Response($html, 'html', 500);
    }
private function error(Twig_Error $err, $isPage=false, $templateString=null)
    {
        if (!$this->debug) {
            if (!$isPage) return '';
            // Debug mode off: show the site's error page
            try {
                $kirby = Kirby::instance();
                $page = $kirby->site()->page($kirby->get('option', 'error'));
                if ($page) return $kirby->render($page);
            }
            // avoid loops
            catch (Twig_Error $err2) {
            }
            // Error page didn't exist or was buggy: rethrow the initial error
            // Can result in the 'fatal.php' white error page (in Kirby 2.4+
            // with Whoops active), or an empty response (white page).
            // That’s consistent with errors for e.g. missing base templates.
            throw $err;
        }

        // Gather information
        $name = $err->getTemplateName();
        $line = $err->getTemplateLine();
        $msg  = $err->getRawMessage();
        $path = null;
        $code = $templateString ? $templateString : '';
        if (!$templateString) {
            try {
                $source = $this->twig->getLoader()->getSourceContext($name);
                $path = $source->getPath();
                $code = $source->getCode();
            }
            catch (Twig_Error $err2) {}
        }

        // When returning a HTML fragment
        if (!$isPage && $this->debug) {
            $info = get_class($err) . ', line ' . $line . ' of ' .
                ($templateString ? 'template string:' : $name);
            $src  = $this->getSourceExcerpt($code, $line, 1, false);
            return '<b>Error:</b> ' . $info . "\n" .
                '<pre style="margin:0">'.$src.'</pre>' . "\n" .
                '➡ ' . $msg . "<br>\n";
        }

        // When rendering a full page with Twig: make a custom error page
        // Note for Kirby 2.4+: we don't use the Whoops error page because
        // it's not possible to surface Twig source code in it's stack trace
        // and code viewer. Whoops will only show the PHP method calls going
        // in in the Twig library. That's a know — but unresolved — issue.
        // https://github.com/filp/whoops/issues/167
        // https://github.com/twigphp/Twig/issues/1347
        // So we roll our own.
        $html = Tpl::load(__DIR__ . '/errorpage.php', [
            'title' => get_class($err),
            'subtitle' => 'Line ' . $line . ' of ' . ($path ? $path : $name),
            'message' => $msg,
            'code' => $this->getSourceExcerpt($code, $line, 6, true)
        ]);
        return new Response($html, 'html', 500);
    }
private function error ( Twig_Error $ err , $ isPage = false , $ templateString = null ) { if ( ! $ this -> debug ) { if ( ! $ isPage ) return '' ; // Debug mode off: show the site's error page try { $ kirby = Kirby :: instance ( ) ; $ page = $ kirby -> site ( ) -> page ( $ kirby -> get ( 'option' , 'error' ) ) ; if ( $ page ) return $ kirby -> render ( $ page ) ; } // avoid loops catch ( Twig_Error $ err2 ) { } // Error page didn't exist or was buggy: rethrow the initial error // Can result in the 'fatal.php' white error page (in Kirby 2.4+ // with Whoops active), or an empty response (white page). // That’s consistent with errors for e.g. missing base templates. throw $ err ; } // Gather information $ name = $ err -> getTemplateName ( ) ; $ line = $ err -> getTemplateLine ( ) ; $ msg = $ err -> getRawMessage ( ) ; $ path = null ; $ code = $ templateString ? $ templateString : '' ; if ( ! $ templateString ) { try { $ source = $ this -> twig -> getLoader ( ) -> getSourceContext ( $ name ) ; $ path = $ source -> getPath ( ) ; $ code = $ source -> getCode ( ) ; } catch ( Twig_Error $ err2 ) { } } // When returning a HTML fragment if ( ! $ isPage && $ this -> debug ) { $ info = get_class ( $ err ) . ', line ' . $ line . ' of ' . ( $ templateString ? 'template string:' : $ name ) ; $ src = $ this -> getSourceExcerpt ( $ code , $ line , 1 , false ) ; return '<b>Error:</b> ' . $ info . "\n" . '<pre style="margin:0">' . $ src . '</pre>' . "\n" . '➡ ' . $ s g . " br>\n"; } // When rendering a full page with Twig: make a custom error page // Note for Kirby 2.4+: we don't use the Whoops error page because // it's not possible to surface Twig source code in it's stack trace // and code viewer. Whoops will only show the PHP method calls going // in in the Twig library. That's a know — but unresolved — issue. // https://github.com/filp/whoops/issues/167 // https://github.com/twigphp/Twig/issues/1347 // So we roll our own. $ html = Tpl :: load ( __DIR__ . '/errorpage.php' , [ 'title' => get_class ( $ err ) , 'subtitle' => 'Line ' . $ line . ' of ' . ( $ path ? $ path : $ name ) , 'message' => $ msg , 'code' => $ this -> getSourceExcerpt ( $ code , $ line , 6 , true ) ] ) ; return new Response ( $ html , 'html' , 500 ) ; }
Handle Twig errors, with different scenarios depending on if we're
rendering a full page or a fragment (e.g. when using the `twig` helper),
and if we're in debug mode or not.

| Page mode            | Fragment mode
-------|----------------------| --------------
Debug: | Custom error page    | Error message
-------|----------------------| --------------
Prod:  | Standard error page, | Empty string
| or let error through |

@param  Twig_Error $err
@param  boolean    $isPage
@param  string     $templateString
@return string|Response
@throws Twig_Error
Handle Twig errors with different scenarios depending on if we re rendering a full page or a fragment ( e . g . when using the twig helper ) and if we re in debug mode or not .