现在我的页面看起来像这样:
if($_GET['something'] == 'somevalue')
{
$output .= 'somecode';
// make a DB query, fetch a row
//...
$row = $stmt->Fetch(PDO::ASSOC);
if($row != null)
{
$output .= 'morecode';
if(somethingIsOK())
{
$output .= 'yet more page output';
}
else
{
$error = 'something is most definitely not OK.';
}
}
else
{
$error = 'the row does not exist.';
}
}
else
{
$error = 'something is not a valid value';
}
if($error == '') // no error
{
//display $output on page
}
else // an error
{
// display whatever error occurred on the page
}
我的工作方式可行,但是对于显而易见的事情却非常繁琐和乏味:假设我在代码中间的某个地方调用了一个函数,或者想检查变量的值,或者验证数据库查询返回有效结果,如果失败,我想输出错误?我将不得不制作另一个if
/ else块,并将所有代码移到新的if块内。这似乎不是一种明智的处理方式。
我一直在阅读有关try / catch的内容,并一直在考虑将我的所有代码放入try语句中,然后让代码按顺序运行,而没有任何if /
else块,如果发生故障,则仅引发异常。从我所读的内容来看,这将暂停执行并使它直接跳转到catch块(就像一条失败的if语句将进入else块一样),然后我可以在其中输出错误消息。但这是可接受的还是标准的做法?
在构建并输出HTML页面的php应用程序中,处理致命或致命错误的最佳方法是什么?我不想只是死于空白屏幕,因为这对用户非常不友好,而是想在页面正文中输出一条消息,同时仍然允许显示页眉和页脚。
谢谢你的建议!
有很多方法可以解决此问题,坦率地说,这些方法本质上都不是“正确的”。
您将需要自己决定哪种方法更适合您-它始终是首选参数(尽管出于某些原因,您应该避免使用某些技术)。
这在很大程度上取决于您如何拆分逻辑,但是我倾向于将所有可以返回非致命错误的代码封装在一个函数中,并使用该函数的返回值指示存在错误。
对于致命错误,我倾向于使用异常(带有try-catch
块)。
现在只是要清楚:
NTP
协议获取当前时间,但服务器没有响应,则可以决定使用本地time
功能,并仍然向用户显示一些有价值的数据。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
本身就是一个例子- 它会返回。
成功返回文件指针资源,错误返回FALSE。
当因为您正是用户想要的而 需要执行 某些代码时(例如,从数据库中读取所有新闻并将其显示给用户),则可以使用异常。让我们举一个简单的例子-
一个用户访问了他的个人资料,想查看他收到的所有消息(现在假设它们以纯文本格式存储)。您可能具有以下功能:
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();
}
无论您做什么,都不要使用异常作为检查可以恢复的东西的方式。
因此,我有一个Javascript脚本,它在一个循环中将小的分数相加,它有可能将0.2加到0.1。然后,这个值被输入到另一个函数,但问题是,我需要0.3来精确输入,而不是0.3000000000000004。 什么是最简单的方法,以确保数字是正确和准确的。注意,它可能得到0.25+0.125等,被添加到简单的四舍五入到小数点1不会解决问题。 也有可能添加0.2+0.1000000000000000
问题内容: 我必须在php中解析大型XML文件,其中之一是6.5 MB,它们甚至可能更大。如我所读,SimpleXML扩展将整个文件加载到一个对象中,这可能不是很有效。以您的经验,最好的方法是什么? 问题答案: 对于大文件,您将要使用SAX解析器而不是DOM解析器。 使用DOM解析器,它将读取整个文件并将其加载到内存中的对象树中。使用SAX解析器,它将顺序读取文件并调用用户定义的回调函数来处理数据
现在我打算创建一个更好的错误处理的“应用程序”框架,我试图寻找最佳实践,但没有找到任何 泽西文档:https://Jersey.java.net/nonav/documentation/1.9/user-guide.html#D4E443 Internet上的几个搜索:http://www.codingpedia.org/ama/error-handing-in-rest-api-with-jer
问题内容: 我有一个针对客户的减速器,另一个针对AppToolbar的减速器,还有一些其他的减速器… 现在让我们说我创建了一个删除客户端的提取操作,如果失败,我在Clients reducer中会有代码,该代码应该做一些事情,但是我也想在AppToolbar中显示一些全局错误。 但是客户端和AppToolbar减速器不共享状态的同一部分,因此我无法在减速器中创建新的动作。 那么我应该如何显示全局错
问题内容: 我有一个方法可以执行一些超时任务。我使用ExecutorServer.submit()获取Future对象,然后使用超时调用future.get()。这工作正常,但是我的问题是处理可能由我的任务引发的检查异常的最佳方法。以下代码可以正常工作,并保留检查的异常,但是如果方法签名中的检查的异常列表发生更改,则显得非常笨拙且容易中断。 对于如何解决这个问题,有任何的建议吗?我需要以Java
当我尝试登录wordpress页面时,出现以下错误: [function.assert]:断言失败在 /home/osisonli/public_html/version.php在第1行斩波连接警告:include_once(rc-模板/-row-templates.php)[function.include]:未能打开流:没有在第118行 /home/osisonli/public_html/w