2015-12-06 5 views
1

Я использую Солью закодировать 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 block ???

Error Info

PHP Fatal error: Call to a member function format() on a non-object

+0

Какая ошибка 500 говорит? Возможно, это синтаксическая ошибка, которую вы делаете. Какова фактическая ошибка в вашем файле журнала? – pavlovich

+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.

Смежные вопросы