【问题标题】:How to display caught errors to users avoiding these common pitfalls?如何向用户显示捕获的错误以避免这些常见的陷阱?
【发布时间】:2014-10-09 11:56:30
【问题描述】:

如果您的网站捕获到您希望将其作为反馈报告给用户的异常,有什么优雅的方法可以在不遇到这些问题的情况下处理它:

  1. 错误发生在页面中间,如果你在捕获时直接打印错误消息,它将位于损坏页面中间的某个位置。

  2. 使用 ob_start() 可以确保您仅在处理完内容并且没有错误后才打印内容,修复了 1) 处的问题,但它会带来最好避免的性能损失。

  3. 在发现错误后重定向到新的 URL 或相同的 URL 可以很好地工作(例如,如果用户发布错误的密码、错误消息或更严重的情况下重定向到通用页面,则重定向回登录表单,应用程序崩溃错误)。这使您容易出现一系列错误重定向(递归),这将使请求超时,最终使用户或开发人员根本没有明确的错误消息。因此,总是重定向错误,尤其是应用程序崩溃错误,似乎不是一个好主意。

  4. 我注意到在我的项目中使用没有 ob_start() 的 ob_clean() 可以删除页面上已经回显的内容。但是 php 手册声明它不应该在没有 ob_start() 的情况下工作,它甚至不应该清除回显的 HTML,只清除缓冲区上的内容。这是怎么回事?

  5. 您可以将所有打印/回显语句保存在 $array = array() 中,而不是 ob_start。据我了解,性能影响较小,但这会使代码难以处理。

    感谢帮助

【问题讨论】:

  • 首先,如果有一些运行时错误(异常,致命),普通访问者应该能看到。相反,您应该捕获异常并实现将显示一些 访问者友好 文本的错误处理程序(例如 出现意外错误,我们正在努力修复它!)并记录错误/异常,以便您可以真正修复它。如果是用户错误(输入错误),那么您只需在页面某处(在字段下的表单中或消息区域中)显示用户相应的错误消息。
  • 是的,我在我的项目中抛出自定义和常规异常,向用户加载适当的消息。然而,问题是如何在不落入上述陷阱之一的情况下显示这些消息

标签: php error-handling user-feedback


【解决方案1】:

我所做的是我有一个包含所需页面的索引,例如,如果您想查看联系页面,您可以请求index.php?page=contact

代码看起来像这样

$return_code = 1;
$return_code = include($page.'.php');
if ($return_code != 1) {
    echo '<div class="error">'.$return_code.'</div>';
}

在您的联系页面中,您可以做任何您需要做的事情,如果出现错误并且您想停止执行页面并只显示错误,只需执行返回

<?php
// If an error happens, simply
return "Error text";
?>

【讨论】:

  • 那会不会导致联系人页面已经回显/打印的内容显示在页面上,落入我提到的陷阱1)?
  • 不,如果页面上有返回,那么除了错误不会显示任何内容。
  • 对不起,但我不明白contacts.php 上的返回将如何阻止任何内容的显示。如果你的 contacts.php 有这两行 1)打印“contact” 2)返回 errorMessage;联系人仍会显示
  • 来自 php 文档:处理返回:包括在失败时返回 FALSE 并引发警告。成功的包含,除非被包含的文件覆盖,否则返回 1。可以在包含的文件中执行 return 语句以终止该文件中的处理并返回到调用它的脚本。
  • 我知道 return 会终止脚本,但是如果该脚本已经向用户输出了 HTML 怎么办?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-06
  • 1970-01-01
  • 2017-06-16
  • 1970-01-01
  • 1970-01-01
  • 2010-11-16
相关资源
最近更新 更多