Php 无法捕获SQL异常

Php 无法捕获SQL异常,php,mysqli,Php,Mysqli,我有一个数据库类: <?php namespace Database\MySQL; class Database { function __construct(){ mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT); try { $this->Connection = new mysqli( "", // Testi

我有一个数据库类:

<?php

namespace Database\MySQL;

class Database
{
    function __construct(){

        mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

        try {
            $this->Connection = new mysqli(
                "", // Testing with no host
                "", // Testing with no user
                "", // ... no password
                ""  // and no DB name
            );
        }
        catch (mysqli_sql_exception $e) {
            throw $e;
        }
...
?>

我仍然得到了致命的错误:未捕获的异常

您的问题是您正在捕获异常,但只是在没有捕获异常的情况下再次抛出异常

如果替换
则抛出$e带有
echo“捕获异常”,您将看到脚本正在捕获异常。但由于您再次抛出它,它将导致错误,除非您有更高级别的
try
/
catch
块或全局异常处理程序


此外,正如许多人在评论中指出的那样,您需要小心名称空间。您需要使用
use
语句或参考
\mysqli\u sql\u exception

您的问题是您正在
catch
捕获异常,但只是
再次抛出它而不
catch
捕获它

如果替换
则抛出$e带有
echo“捕获异常”,您将看到脚本正在捕获异常。但由于您再次抛出它,它将导致错误,除非您有更高级别的
try
/
catch
块或全局异常处理程序


此外,正如许多人在评论中指出的那样,您需要小心名称空间。您需要使用
use
语句或参考
\mysqli\u sql\u exception

您的问题是您正在
catch
捕获异常,但只是
再次抛出它而不
catch
捕获它

如果替换
则抛出$e带有
echo“捕获异常”,您将看到脚本正在捕获异常。但由于您再次抛出它,它将导致错误,除非您有更高级别的
try
/
catch
块或全局异常处理程序


此外,正如许多人在评论中指出的那样,您需要小心名称空间。您需要使用
use
语句或参考
\mysqli\u sql\u exception

您的问题是您正在
catch
捕获异常,但只是
再次抛出它而不
catch
捕获它

如果替换
则抛出$e带有
echo“捕获异常”,您将看到脚本正在捕获异常。但由于您再次抛出它,它将导致错误,除非您有更高级别的
try
/
catch
块或全局异常处理程序




此外,正如许多人在评论中指出的那样,您需要小心名称空间。您需要使用
use
语句或参考
\mysqli\u sql\u exception

您的数据库类是否具有命名空间?@sectus,实际上是的。但是我确实做了
new\mysqli
并且尝试了
catch(\mysqli\u sql\u exception$e)
只是为了确定。等等。。。你所说的扔$e是什么意思?@sectus其实没关系。即使我使用
die(“错误”)改为
抛出$e,我应该通过使用catch块获得任何输出。但是,
catch{…}
被完全忽略。@Nordenheim,请再试一次以捕获
\mysqli\u sql\u异常。不要重复。你的数据库类有名称空间吗?@sectus,事实上,是的。但是我确实做了
new\mysqli
并且尝试了
catch(\mysqli\u sql\u exception$e)
只是为了确定。等等。。。你所说的扔$e是什么意思?@sectus其实没关系。即使我使用
die(“错误”)改为
抛出$e,我应该通过使用catch块获得任何输出。但是,
catch{…}
被完全忽略。@Nordenheim,请再试一次以捕获
\mysqli\u sql\u异常。不要重复。你的数据库类有名称空间吗?@sectus,事实上,是的。但是我确实做了
new\mysqli
并且尝试了
catch(\mysqli\u sql\u exception$e)
只是为了确定。等等。。。你所说的扔$e是什么意思?@sectus其实没关系。即使我使用
die(“错误”)改为
抛出$e,我应该通过使用catch块获得任何输出。但是,
catch{…}
被完全忽略。@Nordenheim,请再试一次以捕获
\mysqli\u sql\u异常。不要重复。你的数据库类有名称空间吗?@sectus,事实上,是的。但是我确实做了
new\mysqli
并且尝试了
catch(\mysqli\u sql\u exception$e)
只是为了确定。等等。。。你所说的扔$e是什么意思?@sectus其实没关系。即使我使用
die(“错误”)改为
抛出$e,我应该通过使用catch块获得任何输出。但是,
catch{…}
被完全忽略。@Nordenheim,请再试一次以捕获
\mysqli\u sql\u异常。别再重复了。不,不是真的。我使用了
catch(mysqli_sql_exception$e){die(“ERROR”)}
而致命错误仍然是一样的。请使用
\mysqli_sql_exception
进行尝试,并验证异常发生的行实际上在
try
块中。这听起来很像是一个名称空间问题和/或您只是没有在
try
/
catch
block.P.S.中包含所有相关代码。不管其他问题如何,我可以100%保证,如果没有更高级别的异常处理程序,只要再次抛出异常就会导致致命错误。是的,我有时觉得自己很傻。它由
\mysqli\u sql\u exception
解决,这是一个名称空间问题。不,不是真的。我使用了
catch(mysqli_sql_exception$e){die(“ERROR”)}
而致命错误仍然是一样的。请使用
\mysqli_sql_exception
进行尝试,并验证异常发生的行实际上在
try
块中。这听起来很像是一个名称空间问题和/或你只是个n
try {
    $this->Connection->query("SET NAMES 'utf87'"); //utf87 just for test
}
catch (mysqli_sql_exception $e) {
    throw $e;
}