【问题标题】:Catching mysql connection error捕获mysql连接错误
【发布时间】:2012-08-06 10:38:07
【问题描述】:

所以我有简单的代码:

try{
    $mysqli = new mysqli($sql_login['host'], $sql_login['user'], $sql_login['password'] , $sql_login['database'], $sql_login['port'] );


    if($mysqli->connect_errno){
        throw new Exception("Failed to connect to MySQL: (" . $mysqli->connect_errno . ") " . $mysqli->connect_error);
    }

}
catch (Exception $e) {
    echo 'Exception: ',  $e->getMessage(), "\n";
}

问题是 php 返回错误和异常。有没有类似 java 中的 throw 和 throws 的东西?

【问题讨论】:

  • ini_set('display_errors', 0); - 无论好坏(我在更坏的阵营)错误和异常在 PHP 中是两个完全不同的东西。
  • @DainisAbols 这不是 mysql 错误。
  • @DaveRandom 我也可以使用@$mysqli...,但这不是我想要的解决方案。
  • @user1564141 很遗憾,您别无选择。如果某些事情触发了错误,并且您的错误报告设置会显示它,那么您唯一的选择就是禁止它。就像我说的,在这一点上我非常处于“更糟糕”的阵营中,但你用你所拥有的东西工作......

标签: php oop exception-handling


【解决方案1】:

您可以从安装自己的错误处理程序开始。一种将 PHP 错误转换为异常的方法。在脚本的开头执行此操作。像这样的东西:

/*
|--------------------------------------------------------------------------
| Alternative error handler
|--------------------------------------------------------------------------
|
| See: http://php.net/manual/en/function.set-error-handler.php
|
*/
function my_error_handler($errno, $errstr, $errfile, $errline)
{
    if (!(error_reporting() & $errno))
    {
        // This error code is not included in error_reporting
        return;
    }
    throw new ErrorException( $errstr, $errno, 0, $errfile, $errline );
}
ini_set('display_errors', FALSE);
set_error_handler("my_error_handler");

现在您可以使用异常作为主要的错误处理机制。您现在需要做的就是在脚本中的正确位置捕获异常并自己显示错误。

您还可以扩展此机制以包括断言处理:

/*
|--------------------------------------------------------------------------
| Assert handling
|--------------------------------------------------------------------------
|
|   See: http://php.net/manual/en/function.assert.php 
|
*/
function my_assert_handler($file, $line, $code)
{
    throw new Exception( "assertion failed @$file::$line($code)" );
}
assert_options(ASSERT_ACTIVE,     1);
assert_options(ASSERT_WARNING,    0);
assert_options(ASSERT_BAIL,       0);
assert_options(ASSERT_QUIET_EVAL, 0);
assert_options(ASSERT_CALLBACK, 'my_assert_handler');

并且只接受 PHP 不是 Java 或 C++。这是一个不一致的混乱。

【讨论】:

  • 事情发生了,当 sql sintax 中出现错误时 - 它停止使用它,结果所有脚本都因致命错误而崩溃。
  • 无法在 PHP 中捕获致命错误。脚本刚刚终止。可能调用了一些最终处理程序,但所有上下文都消失了。
【解决方案2】:

你可以使用PHP的set_error_handler()

【讨论】:

    【解决方案3】:

    在连接的调用前面放一个@符号。这将抑制错误消息。

    【讨论】:

      猜你喜欢
      • 2015-12-02
      • 2011-09-14
      • 1970-01-01
      • 2016-01-06
      • 2016-01-29
      • 1970-01-01
      • 1970-01-01
      • 2015-12-05
      • 1970-01-01
      相关资源
      最近更新 更多