Intl error name: примеры (PHP)
intl_error_name(int $error_code): stringФункция intl_error_name() возвращает строковое название кода ошибки, сгенерированного расширением Internationalization Functions (Intl). Она используется для отладки и логирования, когда операции с международными функциями завершаются неудачно.
Функция принимает единственный аргумент:
- error_code (int) - числовой код ошибки, обычно получаемый с помощью функций
intl_get_error_code()илиintlcal_get_error_code().
Возвращаемое значение - строка с именем константы ошибки или false при некорректном коде.
<?php
$formatter = new NumberFormatter('ru_RU', NumberFormatter::DECIMAL);
// Создаем ситуацию с ошибкой
$formatter->parse('не число');
$errorCode = intl_get_error_code();
echo intl_error_name($errorCode);
?>
U_PARSE_ERROR
<?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
Возвращает числовой код последней ошибки Intl. Используется вместе с intl_error_name() для полной диагностики.
Предоставляет текстовое описание ошибки на английском языке. Более информативна для пользователей, чем intl_error_name().
Проверяет, указывает ли код ошибки на неудачное выполнение операции. Полезна для быстрой проверки без анализа конкретного кода.
intl_error_name() предпочтительнее при необходимости идентификации ошибки по имени константы для систем логирования или условной обработки.
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
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
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
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
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
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());
?>