FuelPHPで例外クラスを独自の例外用アクションに渡す方法

少々やり方が乱暴かもしれないけど。。
とりあえず公式ドキュメントのエラー処理を見た後のほうがわかりやすいです。

エラー処理 – FuelPHP 1.3-dev Documentation

FuelPHPで例外クラス(ここではHttpNotFoundExceptionを例とする)を利用する処理については、
既にドキュメントルート(public)以下のindex.php内で以下のように記載してある。

catch (HttpNotFoundException $e)
{
    $route = array_key_exists('_404_', Router:: $routes) ? Router::$routes['_404_']->translation : Config::get('routes._404_');

    if($route instanceof Closure)
    {
        $response = $route();

        if( ! $response instanceof Response)
        {
            $response = Response::forge($response);
        }
    }
    elseif ($route)
    {
        $response = Request::forge($route, false)->execute()->response();
    }
    else
    {
        throw $e;
    }
}

で、今回やりたいことは上記でキャッチしている例外クラス($e)を自作の404アクションに持ってくること。グローバル変数を利用すれば強引だけどいける。
具体的には、

catch (HttpNotFoundException $e)
{
    $GLOBALS[ 'exception'] = $e;
       
    $route = array_key_exists('_404_', Router:: $routes) ? Router::$routes['_404_']->translation : Config::get('routes._404_');

    if($route instanceof Closure)
    {
        $response = $route();

        if( ! $response instanceof Response)
        {
            $response = Response:: forge($response);
        }
    }
    elseif ($route)
    {
        $response = Request:: forge($route, false)->execute()->response();
    }
    else
    {
        throw $e;
    }
}

ってやって、対象のアクションでグローバル変数を呼び出すだけ。
なんかあまり良いやり方じゃない気がするけど、とりあえず別案が思いつくまでの繋ぎということで。

ちなみにinternal server errorを独自のアクションで処理する場合には、さっきの下にcatch文を追加するだけ

catch (HttpServerErrorException $e)
{
    $GLOBALS['exception'] = $e;
       
    $route = array_key_exists('_500_', Router:: $routes) ? Router::$routes['_500_']->translation : Config::get('routes._500_');

    if($route instanceof Closure)
    {
        $response = $route();

        if( ! $response instanceof Response)
        {
            $response = Response:: forge($response);
        }
    }
    elseif ($route)
    {
        $response = Request:: forge($route, false)->execute()->response();
    }
    else
    {
        throw $e;
    }
}

これでthrowしたときに自作のアクションで捌けるようになる。
ただ、indexにどんどん追加しているやり方もあまり好かないなあ。