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)我需要支持生产环境好。
答案 0 :(得分:0)
一个绝对有效的问题,我发现没有理由进行投票...我在创建包含以下内容的消息日志时遇到了同样的问题:
在消息日志构造函数中,我执行各种检查,因为其中一些属性可能为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