处理Laravel中的非致命异常

时间:2014-10-30 11:07:47

标签: php exception laravel exception-handling

在我的laravel应用程序中,假设我有一些代码如下,作为示例

function convert_amount($amount, $currency, $date)
{
    if (strlen($currency) <> 3)
    {
        // Exception thrown
    } else {
        // convert $amount from $currency on $date
    }
    return $amount;
}

在这里,我只是将数字从货币转换为基数。我执行一个简单的检查,看看传递的货币字符串是否是3个字符,以确保它是ISO货币代码(欧元,英镑,美元等)。如果不是,我想抛出异常,但不会导致应用程序落入错误页面,就像Laravel的错误处理程序一样。

相反,我想继续处理页面但是记录异常并可能在flash消息中显示错误。 我能为Laravel定义一个能够实现这一目标的倾听者吗?我是否需要定义一个新的异常类型NonFatelException,这可能是逻辑。

修改

基本上,我想我可以像这样注册一个新的异常处理程序:

class NonFatalException extends Exception {}

App::error(function(NonFatalException $e)
{
    // Log the exception
    Log::error($e);
    // Push it into a debug warning in the session that can be displayed in the view
    Session::push('debug_warnings', $e->getMessage());
});

然后在我的应用中的某个地方:

throw new NonFatalException('Currency is the wrong format. The amount was not converted');

这样做的问题在于,将调用默认的异常处理程序,从而导致出现错误页面而不是将要访问的页面。 我可以在我的处理程序中返回一个值以避免默认值,但我相信这会导致单独显示返回值,而其余的脚本将无法运行。

1 个答案:

答案 0 :(得分:0)

你走在正确的道路上。为什么不使用try...catch tho?

你的助手方法是:

function convert_amount($amount, $currency, $date)
{
    if (strlen($currency) <> 3)
    {
        throw new NonFatalException('Currency is the wrong format. The amount was not converted');
    } else {
        // convert $amount from $currency on $date
    }
    return $amount;
}

无论何时使用它,请将其放在try...catch

try {
   convert_amount($amount, $currency, $date);
} catch (NonFatalException $e) {
   // Log the exception
   Log::error($e);
   // Push it into a debug warning in the session that can be displayed in the view
   Session::push('debug_warnings', $e->getMessage());
}

这样,您的应用永远不会停止,并且您在会话中收到错误消息。