有没有办法在使用错误类型或错误数量的参数调用vsprintf时捕获?

时间:2015-03-16 02:04:07

标签: php printf

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");

有什么方法可以捕捉到这些类型的错误吗?

修改

也许我的问题不是很清楚。我需要实际尝试/捕获这样的错误,因为我在一个简单的MySQLi包装器中使用vsprintf,因此用户可能会执行以下操作:

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

在这种情况下,我需要以一种有意义的方式告诉他们1)%d期望一个整数2)我不知道如何处理无关的%s 3)我需要支持生产环境好。

2 个答案:

答案 0 :(得分:0)

一个绝对有效的问题,我发现没有理由进行投票...我在创建包含以下内容的消息日志时遇到了同样的问题:

  • vsprintf格式的字符串
  • 参数数组
  • 收件人列表
  • 发件人
  • A type

在消息日志构造函数中,我执行各种检查,因为其中一些属性可能为null,并且某些组合没有意义(例如,没有发件人的'chat'类型,带有发件人的收件人列表)它等等)

因为我需要测试是否正确的数字&将参数类型传递给vsprintf,我在try...catch语句中调用了构造函数中的vsprintf,并报告了捕获的异常。

这并不完美,理想情况下我不需要在构建时“渲染”消息,但它涵盖了我的大部分需求。

希望这有帮助。

答案 1 :(得分: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正在获得大量CPU和关于大数据的RAM