Простая попытка / наконец против попытки / поймать - PullRequest
0 голосов
/ 24 сентября 2018

С простой функцией, такой как:

function hello( $var )
{
    try
    {
        // do something with $var which may or may not throw an exception
        return $var;
    }
    finally
    {
        return $var;
    }
}

Есть ли разница в отношении логики или обработки, если она была преобразована в:

function hello( $var )
{
    try
    {
        // do something with $var which may or may not throw an exception
        return $var;
    }
    catch( Exception $e )
    {
        return $var;
    }
}

Пожалуйста, игнорируйте тот факт, что ничегосделано с $e и игнорирует простоту / бесполезность функции семпла;это просто MCVE .

Цель этого преобразования - сделать исходный код на 100% совместимым в PHP 5.3, потому что finally{} был введен в 5.5, и я хочу сделать минимумизменения, необходимые при сохранении 100% логики.

Я спрашиваю только потому, что лично у меня есть минимальный опыт использования блоков try / catch / finally, и я не знаю всех полученных ошибок.

Есть лилучший способ достижения совместимости с PHP 5.3?

1 Ответ

0 голосов
/ 24 сентября 2018

Если вы добавите return в оператор finally, то он всегда будет выполняться после завершения попытки.В вашем первом примере (вероятно, сокращенном) будет использоваться результат, возвращенный из предложения finally, а не предложения try.

Ваш второй пример немного отличается, поскольку неясно, как вы определяете $var.Если у вас есть $var = $this->throwsException('x'); и в этой строке выдается исключение, то $var будет неопределенным в вашем предложении catch.Если $var уже определено, то условие catch будет тем местом, откуда вы вернетесь, при условии, что предложение try выдает исключение.

Если вам нужна безопасная версия предложения finally для PHP 5.3, я бы сделал что-то вродеэто:

$var = false;
try {
    $var = $this->doSomething();
} catch (Exception $ex) {
    $var = $ex->getMessage();
}
return $var;
...