Intl get error message: примеры (PHP)
intl_get_error_message: stringФункция intl_get_error_message() возвращает строку с описанием последней ошибки, которая произошла в модуле Internationalization (Intl). Эта функция используется для отладки и обработки ошибок при работе с функциями расширения intl, такими как форматирование дат, чисел, преобразование кодировок и другие операции, связанные с локализацией.
Функция не принимает аргументов и возвращает текстовое описание ошибки. Если ошибок не было, возвращается строка 'U_ZERO_ERROR' или аналогичное сообщение об отсутствии ошибок.
Модуль intl построен на библиотеке ICU (International Components for Unicode), и сообщения об ошибках соответствуют стандартам этой библиотеки.
<?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
<?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
Для работы с ошибками модуля intl также доступны:
Возвращает код последней ошибки intl. Числовой код удобен для программной обработки условий. Используется вместе с intl_get_error_message() для полной диагностики.
Принимает код ошибки и возвращает true, если код указывает на неудачное выполнение операции. Полезно для проверки, была ли ошибка критичной.
Специализированные функции для отдельных компонентов intl, которые возвращают ошибки конкретного объекта. Предпочтительнее использовать при работе с объектно-ориентированным стилем.
intl_get_error_message() рекомендуется для процедурного стиля, а методы объектов (например, IntlDateFormatter::getErrorMessage()) - для объектно-ориентированного подхода.
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.
try {
new Intl.DateTimeFormat('ru-RU', { weekday: 'invalid_value' });
} catch (e) {
console.log('Ошибка: ' + e.message);
}
Ошибка: Invalid value for weekday
SELECT CONVERT('текст' USING invalid_encoding);
SHOW WARNINGS;
+---------+------+------------------------------------------+ | Level | Code | Message | +---------+------+------------------------------------------+ | Warning | 1300 | Invalid charset name 'invalid_encoding' | +---------+------+------------------------------------------+
В отличие от PHP, где ошибки intl не генерируют исключений, в Python и JavaScript используются механизмы исключений. В MySQL ошибки кодировок часто возвращают NULL с дополнительными предупреждениями.
<?php
// Ошибка еще не произошла
$message = intl_get_error_message();
echo 'Сообщение: ' . $message;
?>Сообщение: U_ZERO_ERROR
Функция возвращает 'U_ZERO_ERROR' или аналогичное сообщение об отсутствии ошибок. Это не означает проблему в коде, но может ввести в заблуждение.
<?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().
Функция 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().
<?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
<?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
<?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
- Php intl get error message - аргументы и возвращаемое значение
- Функция php intl_get_error_message - описание
- intl get error message - примеры
- intl get error message - похожие методы на php
- intl_get_error_message на js, python, mysql
- intl get error message изменения php
- Примеры intl_get_error_message на php