在php 5中使用try-catch语句时需要考虑哪些性能影响?
我之前在网上看过一些关于这个主题的旧的,看似相互矛盾的信息.我目前必须使用的很多框架都是在php 4上创建的,并且缺少php 5的许多细节.所以,我自己在使用php的try-catchs时没有多少经验.
背景:假设我有以下显然不正确的PHP:
try{
$vtest = '';
print(array_pop($vtest));
}catch(Exception $exx){}
Run Code Online (Sandbox Code Playgroud)
为了使用array_pop,$ vtest显然应该是一个数组,而不是一个字符串.然而,当我运行此代码时,会显示警告.我不希望这样,我只是希望代码无声地失败.
问题:与其他语言相比,PHP try-catch是否有一些特殊之处导致这种情况无效?
免责声明: 仅供参考,确实有其他方法可以在PHP中处理这种情况,但这些都是不可取的.这里的目标是避免:
"签名"技巧:
$vtest = '';
print(@array_pop($vtest)); // <-- would like to avoid this
Run Code Online (Sandbox Code Playgroud)
类型铸造:
$vtest = '';
$vtest = (array)$vtest;
print(array_pop($vtest));
Run Code Online (Sandbox Code Playgroud) 根据PHP手册: 内部PHP函数主要使用错误报告,只有现代面向对象的扩展使用异常.但是,可以使用ErrorException将错误简单地转换为异常
ErrorException中提供的示例:
<?php
function exception_error_handler($errno, $errstr, $errfile, $errline ) {
throw new ErrorException($errstr, 0, $errno, $errfile, $errline);
}
set_error_handler("exception_error_handler");
Run Code Online (Sandbox Code Playgroud)
它似乎允许使用Exceptions而不是默认的错误报告.我的问题是,这是鼓励还是我们的选择?
此外,这是一个更好的做法,像上面的例子一样单独使用Exception,或者同时使用Exception(set_exception_handler)和Error reporting(set_error_handler)?
我们的apache error_log最近填充了类似于以下内容的行(约50GB):
[Wed Feb 01 16:50:15 2012] [error] [client 123.123.123.123] PHP Warning:
unpack() [<a href='function.unpack'>function.unpack</a>]:
Type V: not enough input, need 4, have 1
in /var/www/vhosts/domain.com/httpdocs/imagecreatefrombmp.php on line 52
Run Code Online (Sandbox Code Playgroud)
imagecreatefrombmp.bmp中的第52行如下:
$COLOR = unpack("V",substr($IMG,$P,3).$VIDE);
Run Code Online (Sandbox Code Playgroud)
这条线埋在一个while循环中.
如果再次发生此问题,我希望代码安静地退出while循环.
问题是我无法自己复制问题所以我有点需要盲目解决.
我设计了以下小解决方案.它会达到目的吗?如果再次出现"Type V not input ..."错误,try catch块会捕获它并返回false吗?
try{
$COLOR = unpack("V",substr($IMG,$P,3).$VIDE);
}catch (Exception $e) {
return FALSE;
}
Run Code Online (Sandbox Code Playgroud) PHP 7 中的 TypeError 和 InvalidArgumentException 有什么区别?
何时抛出 TypeError 何时抛出 InvalidArgumentException?
似乎错误越来越像 PHP 7 中
的异常。划分错误和异常的边界线是什么?
错误和异常有什么区别?
我已经在网上和几本书中阅读了大量资源,但所提供的解释并不十分彻底.因此,我仍然感到困惑.
谢谢!
编辑: 看起来我问了两个可能令人困惑的问题.我想要回答的主要问题是错误和异常之间的区别.所以,我已经编辑了上面更具体的内容.谢谢大家的回答.