Есть ли способ отловить, когда vsprintf вызывается с неправильным типом или неправильным числом аргументов?

vsprintf () радостно игнорирует следующие ошибки:

// I'd like to tell me that there are too many arguments.
vsprintf("%d", 1, 2);

// this string gets converted to 0! instead of throwing an exception
vsprintf("%d", "nonsense");

Есть ли способ, которым я могу поймать эти типы ошибок?

редактировать

Возможно, мой вопрос был не очень ясен. Мне нужно на самом деле попытаться / поймать такие ошибки, так как я использую vsprintf внутри простой оболочки MySQLi, чтобы пользователи могли делать что-то вроде:

DB::select("*")->from("User")->where("salary=%d %s",$bogus_string)

В этом случае я должен сказать им осмысленно, что 1)% d ожидал целое число 2) что я не знаю, что делать с посторонними% s 3) Мне также нужно поддерживать производственные среды.

1

Решение

Абсолютно верный вопрос, который я не нахожу в качестве причины для голосования … Я столкнулся с той же проблемой при создании журнала сообщений, который включает в себя:

  • Строка в формате vsprintf
  • Массив параметров
  • Список получателей
  • Отправитель
  • Тип

В конструкторе журнала сообщений я выполняю различные проверки, поскольку некоторые из этих атрибутов могут быть нулевыми, а некоторые комбинации не имеют смысла (например, тип «чат» без отправителя, список получателей с отправителем и т. Д. )

Так как мне нужно было проверить, правильный ли номер & типы аргументов были переданы vsprintf, я закончил вызывать vsprintf внутри моего конструктора в try...catch заявление и сообщение об исключении, которое было поймано.

Это не идеально, так как в идеале мне не нужно «визуализировать» сообщение еще во время создания, но оно покрывает большинство моих потребностей.

Надеюсь это поможет.

0

Другие решения

Вы можете написать что-то вроде этого:

try {

if (!preg_match('~[^%]%[bcdeEfFgGosuxX]~', $msg)) { throw new Exception('There are no sprintf() sequences in `haystack`'); }

$msg = vsprintf($msg, $data);

if (preg_match('~[^%]%[bcdeEfFgGosuxX]~', $msg)) { throw new Exception('There are sprintf() sequences in `haystack` - it means you\'re passing less or too many parameters than needed...'); }

} catch (Exception $e) {}

Пожалуйста, имейте в виду, что Regex получает много процессора & RAM на больших данных

0

По вопросам рекламы [email protected]