Slim忽略try catch块

时间:2015-12-06 08:29:04

标签: php error-handling slim

我正在使用Slim编写REST API代码,我遇到了一种情况,我需要检查用户输入的日期时间是否有效,从而得出这段代码

$app->post('/test',  function() use($app)
{
    verifyRequiredParams(array('d_string'));
    $response = array();
    $d_string = $app->request->post('d_string');

    try {
        $datetime = datetime::createfromformat('d M Y H:i:s', $d_string);
        $output = $datetime->format('d-M-Y H:i:s');
    }
    catch (Exception $e) {
        $response["error"] = true;
        $response["message"] = $e->getMessage();
        echoRespnse(400,$response);

    }
    $response["error"] = false;
    $response["message"] = "Converted Date";
    $response['output'] = $output;
    echoRespnse(200,$response);

});

当我输入有效的日期时间字符串11-Dec-2015 12:18时它工作正常但是如果只是为了测试目的我输入一些随机字符串,它会给出 500内部错误而不是给我任何异常。

为什么忽略 try catch 阻止???

错误信息

  

PHP致命错误:在非对象上调用成员函数format()

1 个答案:

答案 0 :(得分:1)

如果提供的时间字符串无效,

DateTime::createFromFormat将不会抛出异常,但会返回布尔值false。

所以你真的不需要try/catch块来完成这个:

$datetime = \DateTime::createFromFormat('d M Y H:i:s', $d_string);
if (false === $datetime) {
    // send your 400 response and exit
}
$output = $datetime->format('d-M-Y H:i:s');

// the rest of the code

如果你真的想因各种原因保留try/catch块,你可以自己抛出异常并在本地捕获:

try {
    $datetime = \DateTime::createFromFormat('d M Y H:i:s', $d_string);
    if (false === $datetime) {
        throw new \Exception('Invalid date.');
    }
    $output = $datetime->format('d-M-Y H:i:s');
} catch (\Exception $e) {
    $response["error"] = true;
    $response["message"] = $e->getMessage();
    echoRespnse(400,$response);
}

但是我没有看到一个非常好的理由在这种情况下抛出异常只是为了在本地捕获它,所以我会选择第一个解决方案。

如果要显示更详细的错误消息,可以使用DateTime::getLastErrors方法。