Php 如何向用户显示捕获的错误以避免这些常见陷阱?

Php 如何向用户显示捕获的错误以避免这些常见陷阱?,php,error-handling,user-feedback,Php,Error Handling,User Feedback,如果您的网站捕捉到一个您希望作为反馈反馈反馈给用户的异常情况,那么什么是一种优雅的方式来处理它而不会遇到这些问题: > p>错误发生在页面的中间,如果您直接打印错误消息,当它被捕获时,它将位于一个断页中间的某个地方。 使用ob_start()可以确保只在处理完内容后才打印内容,并且没有错误,将问题修复为1),但它会带来性能损失,这是最好避免的 在发现错误后重定向到新的URL或相同的URL可以非常好地工作(例如,如果用户发布了错误的密码,并出现错误消息,则重定向回登录表单,或者如果出现更严重

如果您的网站捕捉到一个您希望作为反馈反馈反馈给用户的异常情况,那么什么是一种优雅的方式来处理它而不会遇到这些问题:

> p>错误发生在页面的中间,如果您直接打印错误消息,当它被捕获时,它将位于一个断页中间的某个地方。

  • 使用ob_start()可以确保只在处理完内容后才打印内容,并且没有错误,将问题修复为1),但它会带来性能损失,这是最好避免的

  • 在发现错误后重定向到新的URL或相同的URL可以非常好地工作(例如,如果用户发布了错误的密码,并出现错误消息,则重定向回登录表单,或者如果出现更严重的应用程序崩溃错误,则重定向回通用页面)。这使得您很容易出现重定向错误链(递归),这将超时请求,最终导致用户或开发人员完全没有明确的错误消息。因此,总是在出现错误时重定向,尤其是应用程序崩溃错误时,似乎是个坏主意

  • 我注意到在我的项目中使用ob_clean()而不使用ob_start(),会删除页面上已有的回显内容。但是php手册指出,如果没有ob_start(),它不应该工作,甚至不应该清除回显的HTML,仅仅是缓冲区中的内容。这是怎么回事

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

    谢谢你的帮助


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

    代码看起来像这样

    $return_code = 1;
    $return_code = include($page.'.php');
    if ($return_code != 1) {
        echo '<div class="error">'.$return_code.'</div>';
    }
    
    $return\u code=1;
    $return_code=include($page.'.php');
    如果($return_code!=1){
    回显“.$return_code.”;
    }
    
    在联系人页面中,您可以执行任何需要执行的操作,如果出现错误,您希望停止页面的执行并只显示错误,只需执行一个返回

    <?php
    // If an error happens, simply
    return "Error text";
    ?>
    
    
    
    首先,如果出现运行时错误(异常、致命),普通访问者应该会看到。相反,您应该捕获异常并实现错误处理程序,该程序将显示一些访客友好的文本(例如,出现了意外错误,我们正在努力修复!),并记录错误/异常,以便您能够真正修复它。如果是用户错误(输入错误),那么您只需在页面的某个位置(在字段下的表单中或消息区域中)显示相应的用户错误消息即可。是的,我会在项目中抛出自定义和常规异常,并向用户加载相应的消息。然而,问题是,如何在不落入上述陷阱的情况下显示这些消息,这是否会导致联系人的页面上显示已回复/打印的内容,落入我提到的陷阱1)不,如果页面上有返回,那么它只会显示错误。对不起,我不明白contacts.php上的返回如何阻止显示任何内容。如果您的contacts.php有以下两行1)打印“contact”2)返回错误消息;php文档:Handling Returns:include Returns FALSE on failure中仍然会显示contact,并发出警告。成功包含,除非被包含的文件覆盖,否则返回1。可以在包含的文件中执行return语句,以终止该文件中的处理并返回到调用它的脚本。我知道返回会终止脚本,但如果该脚本已经向用户输出HTML,该怎么办?