Php 在函数中引发异常或如何进行下降错误处理

Php 在函数中引发异常或如何进行下降错误处理,php,exception,mysqli,prepared-statement,Php,Exception,Mysqli,Prepared Statement,我目前正在使用MySQLi编写的语句来处理数据库。 因为MySQLi准备的语句只在连接错误时抛出错误,所以我被迫自己检查错误,自己也抛出错误。 在PDO中(我将在将来使用它,因为我确信它现在工作得更好),可能有更好的错误处理,因为PDO确实会抛出预期的错误,您可以通过PDO异常捕获这些错误 但现在,我仍然坚持使用MySQLi,所以我想知道我当前的代码是否是良好的实践? 在许多教程和书籍中,我可以找到类似的工作流程,但在某些地方,我读到“使用异常通知用户某些方法失败是低效的,被认为是不好的做法。”

我目前正在使用MySQLi编写的语句来处理数据库。 因为MySQLi准备的语句只在连接错误时抛出错误,所以我被迫自己检查错误,自己也抛出错误。 在PDO中(我将在将来使用它,因为我确信它现在工作得更好),可能有更好的错误处理,因为PDO确实会抛出预期的错误,您可以通过PDO异常捕获这些错误

但现在,我仍然坚持使用MySQLi,所以我想知道我当前的代码是否是良好的实践? 在许多教程和书籍中,我可以找到类似的工作流程,但在某些地方,我读到“使用异常通知用户某些方法失败是低效的,被认为是不好的做法。”()

根据“你的常识”的评论更新1

mysqli_报告(mysqli_报告全部)没有那么好用

我已经做了一些练习,但我仍然不清楚异常和错误之间的区别到底是什么。 当我使用PDO时,我会在执行失败时抛出异常。Mysqli没有。 你必须亲自检查,然后扔掉它。 假设我使用databasewrapper并将其命名为:

  $this->db->getOne($query,'id');
在这个方法的某个地方出现$stmt->execute。我应该检查它是否成功并抛出异常,还是应该在这里触发错误

因为您建议的是错误处理程序

这让我很困惑,因为如果我使用pdo,我应该使用异常处理程序,对吗

更新2

  • 那ajax呢?我使用JSON返回结果。如果出现错误,我应该使用try catch here返回json.success true还是false?或者我应该如何处理这里的错误

  • 如果我想显示更具体的信息怎么办? 例如:当用户执行注册并使用allready注册的用户名和/或电子邮件时,会抛出一个错误,因为违反了唯一密钥。 但我不想只显示“嘿,发生了500个错误”,因为在这种情况下,注册者知道问题出在哪里是很重要的,比如“这个用户名被占用了”

    因此,在这些情况下,try-catch是一种很好的做法,因为您希望显示详细信息,对吗

  • 我只是对何时使用try-catch以及何时让全局错误处理程序为我处理错误感到困惑。 在主题中,我读到:

    “您可以使用set_exception_handler()来处理自定义函数中未捕获的异常。 然而,“正确”的方法是您尝试……在执行查询时捕获异常,并使用自定义函数相应地记录它。” 但在这个话题中,这被认为是不好的做法

    如果我当前的代码是良好实践

    不,在很多方面

    首先,mysqli最终管理了这个例外

    mysqli_report(MYSQLI_REPORT_ALL);
    
    将告诉mysqli抛出异常。然而

    使用异常通知用户某些方法失败是低效的,被认为是不好的做法

    没错。终于有人足够聪明来对付这些无用的教程和书籍了

    //do some logging with the real exception
    
    对于,应用程序中的每一个查询都非常。。。冗余的你不觉得吗?然而

    //show a readable error to the website visitor
    
    这不是“可读性”吗。是的,它是通俗易懂的英语。但是站点访问者与数据库有什么关系呢?什么用户?什么是“检索”所有这些东西都是无用和令人困惑的。请看一些专业网站,比如这一个。它们不会给您带来任何技术细节的负担,只显示一个通用的500错误页面

    而且它不是针对您在代码中执行的每个操作,而是使用set\u error\u handler()集中执行

    而异常只能用于处理错误本身

    所以,您的try..catch块是完全冗余的。在发生错误的情况下,错误处理程序必须捕获异常,记录错误并显示通用500错误页面

    throw new exception('There was an error retrieving the user by id: ' . $stmt->error);
    
    您不觉得这段代码被添加到每个查询执行中,又是一段相当多余的代码吗?你真正需要的是做所有肮脏的工作

    看看这个函数的样子:

    function getById($id)
    {
        $query = "select username from users where user_id = ?";
        $name  = $this->db->getOne($query,$id);
        return new User($name);
    }
    
    两行用于所有数据库操作


    (然而你创建用户类的想法很奇怪)

    我同意Serenarules的说法:“使用异常通知用户某些方法失败是低效的”。 这是无用的:错误消息将在错误日志中找到。用户可以用这些细节做什么?在大多数情况下,“错误500”就足够了

    数据库连接是一个真正的问题,应该引起异常。 但我个人认为,“没有用户找到匹配ID”的情况不应该引起任何异常。相反,这种情况应该只是改变应用程序的行为。
    除非您想在错误日志中侦听这些事件?

    这个问题似乎与主题无关,因为它是关于代码检查的。我只是想知道在函数中使用异常是否是一种好的做法,并用一个示例加以说明。我并不是在问我的具体代码是否好,而是一般的工作流程。你不能对抗这个网站的官僚作风。他们在你的问题中寻找一两个关键词,然后自动触发结束。不过,这是一件相当随意的事情。大多数问题都被忽视了。运气不好。你的PHP版本是什么?这个版本很旧,可能不会抛出异常。然后您必须手动检查执行和抛出异常的结果。好的,谢谢,我将研究一个错误处理程序。我以前没有使用它的原因是因为MySQLi没有抛出太多错误。用户类的创建用于返回用户对象,这有什么奇怪的。通过用户名创建用户类,而不是id.2有这样一个函数。为什么不已经创建一个用户,传递一个id?如果你创建了一个新用户,你还没有id?别担心
    function getById($id)
    {
        $query = "select username from users where user_id = ?";
        $name  = $this->db->getOne($query,$id);
        return new User($name);
    }