【问题标题】:Exception caught in try-catch, returned in ajax error state not success在 try-catch 中捕获的异常,以 ajax 错误状态返回不成功
【发布时间】:2017-05-24 12:25:12
【问题描述】:

我有一个表单,其中包含用于连接数据库的字段。这包括主机名、数据库、用户名和密码。我正在使用 AJAX 调用连接到数据库。需要注意一些错误处理,其中之一是无法连接到数据库。

异常在 try-catch 语句中被捕获,我用错误消息更新了 $result 变量。然后将其返回给 AJAX 调用。

下面是简化版的代码:

AJAX 调用:

$.ajax({
    url: _url + 'dbv.php',
    type: 'POST',
    data: {
        db_host: $('input[name="db_host"]').val(),
        db_name: $('input[name="db_name"]').val(),
        db_username: $('input[name="db_username"]').val(),
        db_password: $('input[name="db_password"]').val(),
        save_path: $('input[name="save_path"]').val()
    },
    dataType: 'json',
    success: function(data) {
        if (data.error) {
            console.log('success (error): ' + JSON.stringify(data));
        }
        else {
            console.log('success: ' + JSON.stringify(data));
        }
    },
    error: function(data) {
        console.log('error: ' + JSON.stringify(data));
    }
});

PHP:

try {

    if ($_POST['db_host'] && $_POST['db_username'] && $_POST['db_password'] && $_POST['db_name'] && $_POST['save_path']):

        $host = $_POST['db_host'];
        $user = $_POST['db_username'];
        $password = $_POST['db_password'];
        $database = $_POST['db_name'];
        $path = $_POST['save_path'];

    else:

        throw new Exception('Empty Fields', '1');

    endif;

    if (!$result->error):

        $conn = new mysqli($host, $user, $password, $database);

        // ...

        mysqli_close($conn);

    endif;
}
catch (Exception $e) {
    $result->error = true;
    $result->message = 'Error: ' . $e->getMessage();
}

$result->message = (!$result->error) ? 'Successful' : $result->message;
echo json_encode($result);

代码中的第一个异常Empty Fields被捕获并返回给success函数。我遇到的问题是error AJAX 状态不会在数据库连接不正确时触发。返回的数据包括 PHP 的默认错误消息和 $result 变量。这不应该只是$result 变量,与Empty Fields 异常相同吗?

正在发生的事情的屏幕截图:

错误响应文本包括 PHP 的错误和$result 变量:

“响应文本”:

PHP 的错误:

"警告: mysqli::mysqli(): php_network_getaddresses: getaddrinfo 失败:不知道这样的主机。在 ____\dbv.php 上 第 35 行

$result变量:

{\"error\":true,\"message\":\"错误:php_network_getaddresses: getaddrinfo 失败:不知道这样的主机。 \"}"

我已经搜索了很多,看起来逻辑很好 - 也许我完全错过了一些东西。

两个类似于我正在尝试做的例子:https://stackoverflow.com/a/20938633/1275525https://stackoverflow.com/a/12693587/1275525

【问题讨论】:

标签: php jquery ajax


【解决方案1】:

我看到了一些解决方案:

  1. [GOOD] 禁用连接警告并抛出自定义异常,例如 https://stackoverflow.com/a/14049169/1559720
  2. [BAD] 使用ob_start 缓冲输出

对于第一点,例如:

@$mysql = new mysqli($host, $user, $password, $database);
if ($mysql->connect_errno) {
   throw new \Exception($mysql->connect_error, $mysql->connect_errno);
}

【讨论】:

  • 是的,这就解决了。谢谢:)
【解决方案2】:

主机名必须是:localhost。我不认为getaddrinfo 是您的主机。什么是getaddrinfo

【讨论】:

  • 这是警告的一部分。问题不在于主机名必须是localhost。我正在测试不正确的细节以处理错误。
【解决方案3】:

当你发现错误时,你会这样做

catch (Exception $e) {
    $result->error = true;

这意味着返回的结果包含“我的错误属性为真”信息,这就是为什么您的 javascript 会认为存在错误的原因。要扭转这种行为,您可以简单地省略最后一行。

但是,您为什么想要这个?当出现错误时,您的 javascript 做一些不同的事情似乎是合乎逻辑的。比如通知用户。

这点我也觉得有点奇怪:

success: function(data) {
    if (data.error) {
        console.log('success (error): ' + JSON.stringify(data));
    }
    else {
        console.log('success: ' + JSON.stringify(data));
    }

既然已经有不同的成功和错误函数,为什么还要检查成功函数中的错误?当出现错误时,这个函数甚至不应该被触发。

【讨论】:

  • $result 是我正在处理的数组,它与 JavaScript 无关。发生实际错误时会触发 error 函数。此外,触发success 并不一定意味着没有发生错误。例如,将空字段错误(第一个 if-else 语句)更改为异常,success 函数被触发而不是error。您应该始终检查success 中的错误。
猜你喜欢
  • 1970-01-01
  • 2015-06-21
  • 2011-05-27
  • 1970-01-01
  • 2013-12-05
  • 1970-01-01
  • 2020-02-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多