Почему PHP try ... catch (Exception) не перехватывает исключение, вызванное inconv () в приложении Yii2? - PullRequest
0 голосов
/ 24 сентября 2019

У меня есть PHP-код (который запускается из приложения Yii2):

    public static function convertNotes($notes) {
        if(is_null($notes)) {
            return $notes;
        }
        $tmp = 'Multibyte conversion error';
        try {
            $tmp = iconv('UTF-16LE', 'UTF-8', $notes); 
        } catch (Exception $ex) {
            $tmp = 'Multibyte conversion error: '+$ex->message;
        }
        return $tmp;
    }

Код пытается преобразовать строку UTF16LE (поступающую из базы данных) в строку UTF8.Иногда входная строка неверна, она не является допустимой строкой UTF16LE (последовательность байтов).В этом случае возникает исключение:

PHP Notice – yii\base\ErrorException
iconv(): Detected an incomplete multibyte character in input string 

Это нормально.Но странным является то, что - даже если я закрою iconv () все в try / catch, исключение не будет поймано и все равно поднимется до верхнего уровня.Что не так с обработкой исключений?

1 Ответ

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

Нужно было поймать ErrorException из структуры Yii:

try {
    $tmp = iconv('UTF-16LE', 'UTF-8', $notes); 
} catch (Exception $ex) {
    $tmp = 'Multibyte conversion error: '+$ex->message;
} catch (yii\base\ErrorException $ex) {
    $tmp = 'Multibyte conversion error (from Yii2): '.$ex->getName();
}
...