Php 试扣挡块

Php 试扣挡块,php,error-handling,slim,Php,Error Handling,Slim,我正在使用Slim编写一个restapi,我遇到了一个情况,我需要检查用户输入的日期时间是否有效,从而产生了这个代码 $app->post('/test', function() use($app) { verifyRequiredParams(array('d_string')); $response = array(); $d_string = $app->request->post('d_string'); try {

我正在使用Slim编写一个restapi,我遇到了一个情况,我需要检查用户输入的日期时间是否有效,从而产生了这个代码

$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()


如果提供的时间字符串无效,
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);
}
但我不认为在这种情况下抛出异常只是为了在本地捕获它是一个很好的理由,所以我选择第一种解决方案


如果您想显示更详细的错误消息,可以使用方法。

错误500说明了什么?可能是你犯了语法错误。日志文件中的实际错误是什么?不,就像我已经说过的,如果我输入一个正确的日期时间字符串,它工作正常,只有当我输入一些随机字符串时,错误才会出现。很遗憾,我无法访问服务器错误日志。我曾要求infra支持提供日志,但他们提供的日志没有提到与此相关的任何错误