有很多方法可以解决这个问题,但坦率地说,没有一种方法本质上是“正确的”。
您必须自己决定哪种方法对您来说更“舒适” - 这始终是一个偏好问题(尽管有些技术您应该避免并且有充分的理由)。
这在很大程度上取决于您如何分割逻辑,但是我倾向于将所有可以返回非致命错误的代码包含在函数内,并使用所述函数的返回值来指示存在错误。
For 致命错误 http://en.wikipedia.org/wiki/Fatal_error我倾向于使用异常(与try-catch
块)。
现在要明确的是:
- 非致命错误是指您可以recoverfrom - 意味着即使出现问题,仍然有一些代码可以执行并生成一些有价值的输出。例如,如果您想使用获取当前时间
NTP
协议,但服务器没有响应,您可以决定使用本地time
功能并仍然向用户显示一些有价值的数据。
- 致命错误是您无法纠正的错误recoverfrom - 意味着发生了非常糟糕的事情,您唯一能做的就是告诉您的用户该页面无法执行其要求的操作。例如,如果您从数据库中获取一些数据并得到
SQL Exception
- 没有可显示的有价值的数据,您只能告知用户这一点。
非致命错误(使用函数返回)
使用函数返回作为处理非致命问题的一个很好的例子是尝试在页面上显示某些文件的内容的函数当这不是页面的主要目标时(例如,您将有一个在每个页面上显示从文本文件中获取的徽章的功能 - 我知道这是牵强的,但请耐心等待)。
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
它本身就是一个例子 -它会返回 http://php.net/manual/en/function.fopen.php.
成功时返回文件指针资源,错误时返回 FALSE。
致命错误(使用异常 - 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."<br/>";
}
} 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();
}
不要过度使用异常!
无论您做什么,都不要使用异常来检查可以恢复的内容。读一读关于另一个问题 https://stackoverflow.com/questions/729379/why-not-use-exceptions-as-regular-flow-of-control(全部归功于安东·戈戈列夫对于这一点以及其他回答者有很好的解释)为什么会出现这种情况。
进一步阅读
现在,学习如何处理错误的最好方法莫过于尝试几种方法,看看什么对你有好处。您可能会发现以下有用:
- W3School 关于 PHP 异常处理 http://www.w3schools.com/php/php_exception.asp
-
关于错误处理的简短教程 http://www.htmlgoodies.com/beyond/php/article.php/3472561/PHP-Tutorial-Error-Handling.htm(类似于我的函数返回方法)
-
有关 PHP 错误处理的详细教程 http://www.devshed.com/c/a/PHP/Error-Handling-in-PHP-Coding-Defensively/- 包括使用
trigger_error()
函数,我没有提到它,因为我不使用它,对它了解不多,但显然它确实很有用。这是一本特别好的读物。
希望这可以帮助 :)