当前位置: 首页 > 知识库问答 >
问题:

Slim忽略try-catch块

葛浩阔
2023-03-14

我正在使用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 致命错误: 调用非对象上的成员函数格式 ()

共有1个答案

史意致
2023-03-14

如果提供的时间字符串无效,则< code > 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

如果出于各种原因,您确实想保留< 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);
}

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

如果要显示更详细的错误消息,可以使用日期时间::get上次错误方法。

 类似资料:
  • 我有一个使用JSoup连接和解析网站数据的程序。当网站在我给出的10秒超时后无法连接时,JSoup方法会抛出一个Uncheck edIOException。这可能包含一个IOException,例如“SSL Peer意外关闭”或“超时”,这是我过去处理过的IOExceptions。这很奇怪,因为它包含一个try catch: 我已经做了各种变通方法,比如在try-catch中包装该方法,使该方法抛

  • 问题内容: 我最初从大学开始编程,然后学习了vb.net。现在,我决定转向Java并进行一些查询。在vb中,try catch语句的布局如下 但是在Java网站(https://docs.oracle.com/javase/tutorial/essential/exceptions/putItTogether.html)中,我发现在Java中,您使用了两个陷阱,如下所示: 我希望有人能够解释为什么

  • null 但是,在完成while循环之后,被完全忽略。我已经用调试器检查了字符串中的数据,它是正确的!没有错误,没有例外。

  • 问题内容: 我正在审查一些新代码。该程序仅具有try和finally块。由于不包含catch块,如果try块遇到异常或任何可抛出的异常,它将如何工作?它是否直接进入了finally块? 问题答案: 如果try块中的任何代码都可以引发已检查的异常,则它必须出现在方法签名的throws子句中。如果引发了未经检查的异常,则该异常会冒泡退出方法。 无论是否引发异常,都始终执行finally块。

  • 我实现了一个try-catch块。 我试图用一种特定的方式实现捕捉块,但是它不太好用。如果输入不是整数,它应该重复并返回到try块。它只工作一次,但更多。 你能给我一些帮助吗?非常感谢。

  • 本文向大家介绍try-catch-finally 中哪个部分可以省略?相关面试题,主要包含被问及try-catch-finally 中哪个部分可以省略?时的应答技巧和注意事项,需要的朋友参考一下 try-catch-finally 其中 catch 和 finally 都可以被省略,但是不能同时省略,也就是说有 try 的时候,必须后面跟一个 catch 或者 finally。