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

Получение кода ошибки модуля Intl в PHP
Раздел: Интернационализация
intl_get_error_code: int

Функция intl_get_error_code в PHP

Функция intl_get_error_code() является частью модуля Internationalization (Intl). Она предназначена для получения числового кода последней ошибки, возникшей при работе функций этого расширения. Функция не принимает аргументов. Использование происходит после вызова методов классов, таких как NumberFormatter, MessageFormatter, Collator или других, работающих с интернационализацией.

Назначение

Функция применяется для отладки и обработки ошибок в сценариях, где операции с локалями, форматированием чисел, дат или сообщений могут завершиться неудачно. Она возвращает целочисленное значение кода ошибки. Расшифровку кода можно получить с помощью функции intl_get_error_message().

Возвращаемое значение

Функция возвращает целое число (тип int), представляющее код последней ошибки модуля Intl. Если ошибок не было, возвращается константа U_ZERO_ERROR, значение которой равно 0.

Простые примеры использования

Пример с NumberFormatter

Попытка создать форматтер с неверной локалью.

<?php
$formatter = new NumberFormatter('invalid_locale', NumberFormatter::DECIMAL);
$errorCode = intl_get_error_code();
echo "Код ошибки: $errorCode\n";
$errorMessage = intl_get_error_message();
echo "Сообщение: $errorMessage";
?>
Код ошибки: 1
Сообщение: Locale: "invalid_locale" is not a valid locale.
Пример с отсутствием ошибки
<?php
$formatter = new NumberFormatter('ru_RU', NumberFormatter::DECIMAL);
$result = $formatter->format(1234.56);
$errorCode = intl_get_error_code();
echo "Код ошибки: $errorCode"; // U_ZERO_ERROR
?>
Код ошибки: 0

Похожие функции в PHP

В модуле Intl существует несколько функций для работы с ошибками:

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

intl_is_failure()

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

Когда что использовать

intl_get_error_code() нужна для получения числового идентификатора ошибки, если требуется ее программная обработка. intl_get_error_message() полезна для вывода сообщения пользователю или в лог. intl_is_failure() применяется для быстрой проверки успешности операции.

Альтернативы в других языках

Python (модуль babel)

В Python нет прямой аналогии. Ошибки обычно обрабатываются через исключения.

from babel import numbers
try:
    formatted = numbers.format_number(1234.56, locale='invalid')
except numbers.NumberFormatError as e:
    print(f"Ошибка: {e}")
Ошибка: Invalid locale: 'invalid'
JavaScript (Intl API)

Объекты Intl в JS генерируют исключения при создании с некорректными аргументами.

try {
    let formatter = new Intl.NumberFormat('invalid');
} catch (e) {
    console.log('Ошибка:', e.message);
}
Ошибка: Invalid language tag: invalid

Intl get error code в MySQL

В MySQL нет прямого аналога. Ошибки интернационализации могут возвращаться как часть общего механизма ошибок сервера.

Типичные ошибки

Неверный порядок вызова

Вызов функции до выполнения операции Intl приводит к получению кода предыдущей ошибки или U_ZERO_ERROR.

<?php
$oldError = intl_get_error_code(); // Может быть не 0
$fmt = new NumberFormatter('ru_RU', NumberFormatter::DECIMAL);
$fmt->format(1000);
$newError = intl_get_error_code();
?>

Нужно сбрасывать состояние ошибок или проверять его сразу после целевой операции.

Игнорирование проверки ошибок
<?php
$formatter = new NumberFormatter('en_US', NumberFormatter::DECIMAL);
// parse может вернуть false при ошибке
$value = $formatter->parse('not a number');
if ($value === false) {
    $code = intl_get_error_code();
    echo "Ошибка разбора: $code";
}
?>
Ошибка разбора: 9

История изменений

Функция intl_get_error_code() появилась в PHP 5.3.0 вместе с модулем Intl. С тех пор ее поведение оставалось стабильным. Важные изменения связаны с улучшением поддержки стандарта ICU и добавлением новых кодов ошибок.

PHP 8.0

Строгая типизация требует явного приведения типов, но функция всегда возвращает целое число.

PHP 8.1 и новее

Изменений в самой функции нет, но развивается модуль Intl, добавляются новые форматеры и возможности.

Расширенные примеры

Обработка ошибок в цикле
Пример php
<?php
$locales = ['en_US', 'invalid_locale', 'fr_FR'];
foreach ($locales as $locale) {
    $formatter = new NumberFormatter($locale, NumberFormatter::DECIMAL);
    if (intl_get_error_code() !== 0) {
        echo "Ошибка для локали '$locale': " . intl_get_error_message() . "\n";
        // Сброс состояния ошибки для следующей итерации
        intl_get_error_code();
    } else {
        echo "Форматтер для '$locale' создан успешно.\n";
    }
}
?>
Форматтер для 'en_US' создан успешно.
Ошибка для локали 'invalid_locale': Locale: "invalid_locale" is not a valid locale.
Форматтер для 'fr_FR' создан успешно.
Использование с intl_is_failure()
Пример php
<?php
$collator = Collator::create('ru_RU');
$collator->compare('строка', null); // Неверный аргумент
if (intl_is_failure(intl_get_error_code())) {
    echo "Операция завершилась с ошибкой.\n";
}
?>
Операция завершилась с ошибкой.
Логирование ошибок
Пример php
<?php
function formatCurrency($amount, $locale) {
    $formatter = new NumberFormatter($locale, NumberFormatter::CURRENCY);
    $result = $formatter->formatCurrency($amount, 'USD');
    $errorCode = intl_get_error_code();
    if ($errorCode !== 0) {
        error_log("Intl error $errorCode: " . intl_get_error_message());
        return null;
    }
    return $result;
}
?>

PHP intl_get_error_code function comments

En
Intl get error code Get the last error code