在 PHP 脚本中处理错误并继续执行
Posted
技术标签:
【中文标题】在 PHP 脚本中处理错误并继续执行【英文标题】:Handling errors and continuing execution in PHP script 【发布时间】:2011-08-22 19:20:34 【问题描述】:当它只涉及脚本的一小部分时,我不想“死()”,我尝试了:
$result = mysql_query($sql) or echo("error with responses");
但它产生了一个错误。我如何只发出一条错误消息并继续执行脚本的其余部分,因为即使它无法连接,其余部分也不应该受到影响。
【问题讨论】:
问题的标题差点让我得了动脉瘤。 看,现在这是获取视图/响应的标题。通常只有致命错误(通常是语法错误等)才会终止脚本。您收到的具体错误信息是什么? 其实挺好笑的,我没注意我的标题,看了问的问题列表就问了。大声笑我不想仅仅因为 mysql 错误而终止脚本。我想继续执行脚本的其余部分,即使它无法从 db 获取数据。 我已经更新了标题,因为前一个似乎(充其量)无关紧要。 :-) 【参考方案1】:$result = mysql_query($sql);
if(mysql_error())
echo "Error: " . mysql_error();
【讨论】:
谢谢,这正是我想要的! @netrox 所以接受这个答案,你的接受率会更高。 我等待 10 分钟过期:/【参考方案2】:就您的原始问题标题而言 - 您不能。 die
和exit
的目的是终止脚本处理。如果您不想终止脚本处理,请不要调用die
或exit
。
在抑制错误输出方面,可以使用error control operator (@
),但不建议这样做。 (如果您以这种方式抑制错误,您必须自行检查错误状态。)
例如,您可以使用:
$result = @mysql_query($sql);
if(is_resource($result))
// The query worked...
else
// Handle error state, perhaps using mysql_error
但是,为了清楚起见,绝不随便将错误抑制器添加到函数调用中。您必须确保自己正确处理任何潜在错误。
【讨论】:
【参考方案3】:$result = mysql_query($sql) or print("error with responses");
Echo 不能用于逻辑比较,例如您正在尝试做的事情。您应该改用 print,这不会导致 php 错误。
【讨论】:
【参考方案4】:检查mysql_query的返回类型
$result = mysql_query($sql);
if ($result===false)
echo 'The Query failed';
//> Continue
【讨论】:
【参考方案5】:您不必使用die
作为第二个函数调用,它只是在几乎所有mysql_query
教程中用作约定。
我们所做的只是评估一个布尔表达式。 $result = $a OR $b
。如果$a
的值为真,那么我们永远不会执行$b
,因为我们不需要。我们已经满足逻辑 OR
与运算符的一侧为真,这就是我们所需要的。
die() 函数立即退出脚本并显示一条消息。您可以将其替换为您自己的函数以打印漂亮的错误消息并继续执行脚本而不退出。例如:
function my_error_function($status)
echo "ERROR: $status";
$result = mysql_query($sql) or my_error_function("Uhoh. There was a problem executing $sql.");
【讨论】:
【参考方案6】:您可以关闭错误报告,这是您在生产环境中无论如何都想做的。
error_reporting(0);
它仍然会抛出错误,但不会再显示。
不过,这很不寻常。我想不出有人愿意接受 mySQL 错误的原因 - 如果问题是 SQL 损坏,您通常会提前发现它。
【讨论】:
MySQL 错误可能很好 - 例如,如果您遇到重复键错误,您会向用户显示他们的用户名/URL/已经存在的消息并继续。 @ceejayoz 我倾向于事先了解这一点。我不喜欢向最终用户显示原始 SQL 错误消息,即使服务器无法访问。 您不必显示原始错误消息。使用mysql_errno()
找出错误所在,然后处理它。
@ceejayoz 是的,那么我们在同一页上。我以为您的意思是直接将错误传递给用户【参考方案7】:
您应该查看 try / catch 而不是 die() 或 exit
【讨论】:
唉,老旧的 mysql 扩展不会抛出异常,所以没有什么可以尝试/捕获的。如果使用 PDO,这将是正确的。 @charles:使用包装层使其抛出异常或使用错误异常的另一个原因。所以有办法让它工作......以上是关于在 PHP 脚本中处理错误并继续执行的主要内容,如果未能解决你的问题,请参考以下文章