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) Мне также нужно поддерживать производственные среды.
Абсолютно верный вопрос, который я не нахожу в качестве причины для голосования … Я столкнулся с той же проблемой при создании журнала сообщений, который включает в себя:
В конструкторе журнала сообщений я выполняю различные проверки, поскольку некоторые из этих атрибутов могут быть нулевыми, а некоторые комбинации не имеют смысла (например, тип «чат» без отправителя, список получателей с отправителем и т. Д. )
Так как мне нужно было проверить, правильный ли номер & типы аргументов были переданы vsprintf, я закончил вызывать vsprintf внутри моего конструктора в try...catch
заявление и сообщение об исключении, которое было поймано.
Это не идеально, так как в идеале мне не нужно «визуализировать» сообщение еще во время создания, но оно покрывает большинство моих потребностей.
Надеюсь это поможет.
Вы можете написать что-то вроде этого:
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 на больших данных