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

Использование intl_error_name для работы с ошибками интернационализации
Раздел: Интернационализация
intl_error_name(int $error_code): string
Основные сведения о функции intl_error_name

Функция intl_error_name() возвращает строковое название кода ошибки, сгенерированного расширением Internationalization Functions (Intl). Она используется для отладки и логирования, когда операции с международными функциями завершаются неудачно.

Функция принимает единственный аргумент:

  • error_code (int) - числовой код ошибки, обычно получаемый с помощью функций intl_get_error_code() или intlcal_get_error_code().

Возвращаемое значение - строка с именем константы ошибки или false при некорректном коде.

Простые примеры использования
Пример 1: Получение названия ошибки
<?php
$formatter = new NumberFormatter('ru_RU', NumberFormatter::DECIMAL);
// Создаем ситуацию с ошибкой
$formatter->parse('не число');
$errorCode = intl_get_error_code();
echo intl_error_name($errorCode);
?>
U_PARSE_ERROR
Пример 2: Проверка наличия ошибки
<?php
$collator = new Collator('en_US');
$collator->compare('строка1', 'строка2');
$error = intl_get_error_code();
if($error !== U_ZERO_ERROR) {
    echo 'Произошла ошибка: ' . intl_error_name($error);
}
?>
Произошла ошибка: U_ZERO_ERROR
Похожие функции в PHP

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

Предоставляет текстовое описание ошибки на английском языке. Более информативна для пользователей, чем intl_error_name().

intl_is_failure()

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

intl_error_name() предпочтительнее при необходимости идентификации ошибки по имени константы для систем логирования или условной обработки.

Аналоги в других языках программирования
JavaScript (ICU4J через Node.js)
const { NumberFormat } = require('icu4j');
let formatter = new NumberFormat('ru-RU');
try {
    formatter.parse('не число');
} catch (error) {
    console.log(error.name); // Error
    console.log(error.message); // Строковое описание
}
Error
Error parsing number
Python (PyICU)
from icu import NumberFormat, UParseError
import icu

try:
    fmt = NumberFormat.createInstance(icu.Locale('ru_RU'))
    fmt.parse('не число')
except UParseError as e:
    print(e.code)  # Числовой код
    # Прямого аналога intl_error_name нет
1
Java (ICU4J)
import com.ibm.icu.text.NumberFormat;
import com.ibm.icu.util.ULocale;

NumberFormat fmt = NumberFormat.getInstance(ULocale.forLanguageTag("ru-RU"));
ParsePosition pos = new ParsePosition(0);
fmt.parse("не число", pos);
if (pos.getErrorIndex() != -1) {
    // Аналогично intl_error_name через ErrorCode
    System.out.println("U_PARSE_ERROR");
}

В других языках обычно используется механизм исключений или отдельные объекты ошибок вместо функций получения имени.

Распространенные ошибки
Передача некорректного кода ошибки
<?php
$result = intl_error_name(999999);
var_dump($result);
?>
bool(false)
Использование без предварительной проверки
<?php
// Нет вызова функций Intl
$name = intl_error_name(0);
echo $name;
?>
U_ZERO_ERROR
Забывают сбросить ошибку
<?php
$formatter = new NumberFormatter('ru_RU', NumberFormatter::DECIMAL);
$formatter->parse('не число');
$error1 = intl_get_error_code();

// Следующий вызов успешен
$formatter->parse('123');
$error2 = intl_get_error_code();

echo intl_error_name($error1) . '\n';
echo intl_error_name($error2);
?>
U_PARSE_ERROR
U_ZERO_ERROR
История изменений функции

В PHP 8.0.0 функция стала возвращать false вместо null при передаче некорректного кода ошибки. Ранее возвращала null.

<?php
// PHP 7.x
var_dump(intl_error_name(999999));
// NULL

// PHP 8.x+
var_dump(intl_error_name(999999));
// bool(false)
?>

Других значительных изменений в поведении функции не было. Расширение Intl активно развивается, добавляются новые коды ошибок.

Расширенные примеры применения
Система логирования с классификацией ошибок
Пример php
<?php
class IntlErrorLogger {
    public static function logError(\Throwable $context = null) {
        $errorCode = intl_get_error_code();
        $errorName = intl_error_name($errorCode);
        
        $logEntry = sprintf(
            "[%s] Intl Error: %s (%d). Message: %s\n",
            date('Y-m-d H:i:s'),
            $errorName,
            $errorCode,
            intl_get_error_message()
        );
        
        // Логирование в зависимости от типа ошибки
        if (strpos($errorName, 'PARSE') !== false) {
            file_put_contents('parse_errors.log', $logEntry, FILE_APPEND);
        } elseif (strpos($errorName, 'MEMORY') !== false) {
            file_put_contents('critical_errors.log', $logEntry, FILE_APPEND);
        }
    }
}

// Пример использования
$fmt = new NumberFormatter('ru_RU', NumberFormatter::DECIMAL);
$fmt->parse('abc');
IntlErrorLogger::logError();
?>
Обработка ошибок в пакетных операциях
Пример php
<?php
function batchFormatNumbers(array $numbers, string $locale): array {
    $formatter = new NumberFormatter($locale, NumberFormatter::CURRENCY);
    $result = [];
    $errors = [];
    
    foreach ($numbers as $index => $number) {
        $formatted = $formatter->format($number);
        
        if (intl_is_failure(intl_get_error_code())) {
            $errorName = intl_error_name(intl_get_error_code());
            $errors[] = [
                'index' => $index,
                'value' => $number,
                'error' => $errorName
            ];
            // Сбрасываем ошибку для следующей итерации
            intl_get_error_code();
        } else {
            $result[$index] = $formatted;
        }
    }
    
    return ['result' => $result, 'errors' => $errors];
}

$data = [1234.56, -500, 'invalid', 789];
$batchResult = batchFormatNumbers($data, 'ru_RU');
print_r($batchResult['errors']);
?>
Array
(
    [0] => Array
        (
            [index] => 2
            [value] => invalid
            [error] => U_PARSE_ERROR
        )

)
Интеграция с системой мониторинга
Пример php
<?php
function checkIntlHealth(): array {
    $tests = [
        'NumberFormatter' => function() {
            $fmt = new NumberFormatter('en_US', NumberFormatter::DECIMAL);
            return $fmt->format(1234567.89) === '1,234,567.89';
        },
        'Collator' => function() {
            $collator = new Collator('en_US');
            return $collator->compare('a', 'b') < 0;
        }
    ];
    
    $results = [];
    foreach ($tests as $name => $test) {
        try {
            $success = $test();
            $errorCode = intl_get_error_code();
            $results[$name] = [
                'status' => $success ? 'OK' : 'FAILED',
                'error_code' => $errorCode,
                'error_name' => intl_error_name($errorCode)
            ];
        } catch (\Throwable $e) {
            $results[$name] = [
                'status' => 'EXCEPTION',
                'exception' => $e->getMessage()
            ];
        }
    }
    
    return $results;
}

print_r(checkIntlHealth());
?>

PHP intl_error_name function comments

En
Intl error name Get symbolic name for a given error code