有很多方法,你可以处理这一点,坦率地说,没有一个是内在的“正确”。
你必须自己决定,哪种方法对你更加“舒适” – 它总是一个偏好的主人(虽然有一些技术,你应该避免和好的原因)。
它将高度依赖于如何拆分逻辑,但我倾向于包含所有可以在函数中返回非致命错误的代码,并使用所述函数的返回值来指示存在错误。
对于fatal errors我倾向于使用异常(用try-catch块)。
现在只是为了清楚:
>非致命错误是一种可以从中恢复的错误 – 意味着即使出现错误,仍然有一些代码可以执行并生成一些有价值的输出。例如,如果您想使用NTP协议获取当前时间,但服务器没有响应,您可以决定使用本地时间功能,并仍然向用户显示一些有价值的数据。
>一个致命错误是一个错误,你将无法恢复 – 意味着一个真正的错误发生,你能做的唯一的事情是告诉你的用户,页面不能做什么被要求。例如,如果您从数据库获取一些数据并获得SQL异常 – 没有有价值的数据显示,您只能通知用户这一点。
非致命错误(使用函数返回)
使用函数返回作为处理非致命问题的一个很好的例子是一个函数,它试图在页面上显示某些文件的内容,但这不是页面的主要目的(例如,一个功能,显示徽章,从一个文本文件,在每一个单独的页面 – 我知道这是很牵强,但与我抱着)。
function getBadge($file){
$f = fopen($file,'r');
if(!$f){
return null;
}
.. do some processing ..
return $badges;
}
$badges = getBadges('badges.txt');
if(!$badges){
echo "Cannot display badges.";
} else {
echo $badges;
}
.. carry on doing whatever page should be doing ..
事实上,函数fopen本身就是一个这样的例子 – it will return。
Returns a file pointer resource on success, or FALSE on error.
致命错误(使用异常 – try-catch)
当你有一些代码需要执行,因为它是用户想要的(例如从数据库中读取所有新闻并显示给用户),你可以使用异常。让我们举一个简单的例子 – 一个用户访问他的个人资料,并希望看到他的所有消息(让我们假设,现在,他们以纯文本存储)。您可能有以下功能:
function getMessages($user){
$messages = array();
$f = fopen("messages_$user.txt","r");
if(!$f){
throw new Exception("Could not read messages!");
}
... do some processing ...
return $messages;
}
并使用它像这样:
try{
..do some stuff..
$messages = getMessages($_SESSION['user'])); //assuming you store username in $_SESSION
foreach($messages as $msg){
echo $msg."
";
}
} catch(Exception $e){
echo "Sorry, there was an error: ".$e->getMessage();
}
现在这可能派上用场,如果你有一个“顶级”脚本,将执行所有其他代码。这意味着,例如,在您的index.php中,您将只有:
try{
.. execute some code, perform some functions ..
} catch(Exception $e){
echo "Sorry, there was an error: ".$e->getMessage();
}
不要过度使用异常!
无论你做什么,永远不要使用异常作为一种方法来检查你可以恢复的东西。有一个阅读on another question(完全信用转给安东Gogolev的一个很好的解释,以及其他答案)为什么是这种情况。
进一步阅读
现在没有更好的方法来学习如何处理错误,而不是尝试几件事情,看看什么是对你有好处。您可能会发现以下有用:
希望这可以帮助 :)