Intl get error code: примеры (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.
Простые примеры использования
Попытка создать форматтер с неверной локалью.
<?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() для полной диагностики.
Проверяет, указывает ли код ошибки на неудачное выполнение операции. Принимает код ошибки как аргумент и возвращает true, если код не равен U_ZERO_ERROR.
intl_get_error_code() нужна для получения числового идентификатора ошибки, если требуется ее программная обработка. intl_get_error_message() полезна для вывода сообщения пользователю или в лог. intl_is_failure() применяется для быстрой проверки успешности операции.
Альтернативы в других языках
В 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'
Объекты 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 и добавлением новых кодов ошибок.
Строгая типизация требует явного приведения типов, но функция всегда возвращает целое число.
Изменений в самой функции нет, но развивается модуль Intl, добавляются новые форматеры и возможности.
Расширенные примеры
<?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' создан успешно.
<?php
$collator = Collator::create('ru_RU');
$collator->compare('строка', null); // Неверный аргумент
if (intl_is_failure(intl_get_error_code())) {
echo "Операция завершилась с ошибкой.\n";
}
?>Операция завершилась с ошибкой.
<?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;
}
?>