Intl get error message: примеры (PHP)

Работа с intl_get_error_message: обработка ошибок интернационализации
Раздел: Интернационализация
intl_get_error_message: string
Функция intl_get_error_message

Функция intl_get_error_message() возвращает строку с описанием последней ошибки, которая произошла в модуле Internationalization (Intl). Эта функция используется для отладки и обработки ошибок при работе с функциями расширения intl, такими как форматирование дат, чисел, преобразование кодировок и другие операции, связанные с локализацией.

Функция не принимает аргументов и возвращает текстовое описание ошибки. Если ошибок не было, возвращается строка 'U_ZERO_ERROR' или аналогичное сообщение об отсутствии ошибок.

Модуль intl построен на библиотеке ICU (International Components for Unicode), и сообщения об ошибках соответствуют стандартам этой библиотеки.

Короткие примеры использования
Пример 1: Получение ошибки при некорректном форматировании даты
<?php
$formatter = new IntlDateFormatter('ru_RU', IntlDateFormatter::FULL, IntlDateFormatter::FULL);
// Создаем намеренную ошибку - передаем неверный тип данных
$result = datefmt_format($formatter, 'not_a_timestamp');
if ($result === false) {
    echo 'Ошибка: ' . intl_get_error_message();
}
?>
Ошибка: datefmt_format: error converting time to UnicodeString: U_ILLEGAL_ARGUMENT_ERROR
Пример 2: Проверка наличия ошибки после операции
<?php
$collator = collator_create('ru_RU');
// Пытаемся сравнить строки с неверным количеством аргументов
$comparison = collator_compare($collator, 'строка1');

$errorMessage = intl_get_error_message();
$errorCode = intl_get_error_code();

if (intl_is_failure($errorCode)) {
    echo 'Код ошибки: ' . $errorCode . '\n';
    echo 'Сообщение: ' . $errorMessage;
}
?>
Код ошибки: 1
Сообщение: collator_compare: at least two arguments required: U_ILLEGAL_ARGUMENT_ERROR
Похожие функции в PHP

Для работы с ошибками модуля intl также доступны:

Возвращает код последней ошибки intl. Числовой код удобен для программной обработки условий. Используется вместе с intl_get_error_message() для полной диагностики.

intl_is_failure()

Принимает код ошибки и возвращает true, если код указывает на неудачное выполнение операции. Полезно для проверки, была ли ошибка критичной.

collator_get_error_message() / datefmt_get_error_message()

Специализированные функции для отдельных компонентов intl, которые возвращают ошибки конкретного объекта. Предпочтительнее использовать при работе с объектно-ориентированным стилем.

intl_get_error_message() рекомендуется для процедурного стиля, а методы объектов (например, IntlDateFormatter::getErrorMessage()) - для объектно-ориентированного подхода.

Альтернативы в других языках
Python: модуль icu
import icu

try:
    fmt = icu.SimpleDateFormat('yyyy-MM-dd', icu.Locale('ru_RU'))
    result = fmt.parse('invalid_date')
except icu.ICUError as e:
    print(f'Ошибка ICU: {e}')
Ошибка ICU: Failed to parse the given string.
JavaScript: Intl API и обработка исключений
try {
    new Intl.DateTimeFormat('ru-RU', { weekday: 'invalid_value' });
} catch (e) {
    console.log('Ошибка: ' + e.message);
}
Ошибка: Invalid value for weekday
MySQL: функции с возвратом NULL и SHOW WARNINGS
SELECT CONVERT('текст' USING invalid_encoding);
SHOW WARNINGS;
+---------+------+------------------------------------------+
| Level   | Code | Message                                  |
+---------+------+------------------------------------------+
| Warning | 1300 | Invalid charset name 'invalid_encoding' |
+---------+------+------------------------------------------+

В отличие от PHP, где ошибки intl не генерируют исключений, в Python и JavaScript используются механизмы исключений. В MySQL ошибки кодировок часто возвращают NULL с дополнительными предупреждениями.

Типичные ошибки
Ошибка 1: Проверка без предварительного вызова intl-функции
<?php
// Ошибка еще не произошла
$message = intl_get_error_message();
echo 'Сообщение: ' . $message;
?>
Сообщение: U_ZERO_ERROR

Функция возвращает 'U_ZERO_ERROR' или аналогичное сообщение об отсутствии ошибок. Это не означает проблему в коде, но может ввести в заблуждение.

Ошибка 2: Игнорирование кодов ошибок
<?php
$formatter = datefmt_create('ru_RU', IntlDateFormatter::FULL, IntlDateFormatter::FULL);
$result = datefmt_format($formatter, time());

// Проверяем только сообщение, но не код ошибки
if ($result === false) {
    echo 'Ошибка: ' . intl_get_error_message();
} else {
    echo 'Успех: ' . $result;
}
?>
Успех: воскресенье, 1 января 2023 г., 0:00:00

Рекомендуется всегда проверять как сообщение, так и код ошибки через intl_get_error_code() и intl_is_failure().

Изменения в версиях PHP

Функция intl_get_error_message() была добавлена в PHP 5.2.4 вместе с модулем intl. С тех пор ее поведение оставалось стабильным.

В PHP 8.0 не было значительных изменений в работе этой функции, но улучшена общая интеграция модуля intl с объектной моделью PHP. В PHP 8.1 также не было изменений, специфичных для данной функции.

Важное замечание: начиная с PHP 8.0, многие функции модуля intl стали более строгими к типам передаваемых аргументов, что может приводить к более частому возникновению ошибок, обнаруживаемых через intl_get_error_message().

Расширенные примеры
Пример 1: Комплексная обработка ошибок в цикле
Пример php
<?php
$dates = [time(), 'invalid_date', false, time()];
$formatter = datefmt_create('ru_RU', IntlDateFormatter::FULL, IntlDateFormatter::FULL);

foreach ($dates as $index => $date) {
    $result = datefmt_format($formatter, $date);
    
    if ($result === false) {
        $errorCode = intl_get_error_code();
        $errorMessage = intl_get_error_message();
        
        echo "Элемент {$index}: Ошибка {$errorCode} - {$errorMessage}\n";
        
        // Сброс состояния ошибки для следующей итерации
        intl_get_error_message();
    } else {
        echo "Элемент {$index}: {$result}\n";
    }
}
?>
Элемент 0: воскресенье, 1 января 2023 г., 0:00:00
Элемент 1: Ошибка 1 - datefmt_format: error converting time to UnicodeString: U_ILLEGAL_ARGUMENT_ERROR
Элемент 2: Ошибка 1 - datefmt_format: error converting time to UnicodeString: U_ILLEGAL_ARGUMENT_ERROR
Элемент 3: воскресенье, 1 января 2023 г., 0:00:00
Пример 2: Создание обертки для безопасного форматирования
Пример php
<?php
function safe_intl_format(IntlDateFormatter $formatter, $value) {
    $result = $formatter->format($value);
    
    if ($result === false) {
        $errorCode = $formatter->getErrorCode();
        $errorMessage = $formatter->getErrorMessage();
        
        // Логирование ошибки
        error_log("Intl error {$errorCode}: {$errorMessage}");
        
        // Возврат значения по умолчанию
        return 'Дата не определена';
    }
    
    return $result;
}

$formatter = new IntlDateFormatter('ru_RU', IntlDateFormatter::FULL, IntlDateFormatter::FULL);
echo safe_intl_format($formatter, 'not_a_date') . "\n";
echo safe_intl_format($formatter, time());
?>
Дата не определена
воскресенье, 1 января 2023 г., 0:00:00
Пример 3: Отладка цепочки операций с intl
Пример php
<?php
// Сбрасываем возможные предыдущие ошибки
intl_get_error_message();

$collator = collator_create('ru_RU');
collator_set_strength($collator, Collator::PRIMARY);

// Первая операция с ошибкой
collator_compare($collator, 'строка');
$error1 = intl_get_error_message();

// Вторая операция - успешная
collator_compare($collator, 'строка1', 'строка2');
$error2 = intl_get_error_message();

// Третья операция с другой ошибкой
collator_set_strength($collator, 999);
$error3 = intl_get_error_message();

echo "Ошибка 1: {$error1}\n";
echo "Ошибка 2: {$error2}\n";
echo "Ошибка 3: {$error3}\n";
?>
Ошибка 1: collator_compare: at least two arguments required: U_ILLEGAL_ARGUMENT_ERROR
Ошибка 2: U_ZERO_ERROR
Ошибка 3: collator_set_strength: invalid collation strength: U_ILLEGAL_ARGUMENT_ERROR

PHP intl_get_error_message function comments

En
Intl get error message Get description of the last error