1

您如何处理 Mediawiki 扩展中的错误情况?

我编写了一个扩展,它使用几个存储过程从 SQL Server 表中检索数据。

在数据库或服务器脱机之前一切正常,此时 mssql_connect 调用失败。我已经尝试了很多方法来处理这个问题,但是每一种方法要么失败,要么出现错误 500,要么在其他空白页面上出现一些错误文本,这两种方法都阻止了 wiki 页面的加载。我希望它能够优雅地失败并允许 wiki 页面的其余部分正确加载。

我知道我遗漏了一些明显的东西,有什么想法吗?

下面是我用来连接数据库并将值返回到页面的代码:

function RetrieveFromDatabase( $sproc, $spparam )
{
    $usr =  "usr";
    $pwd =  "pwd";
    $db =   "BGInfo";
    $host = "server";
    $output = "";

    // connect to database
  $con = mssql_connect ($host, $usr, $pwd);
  mssql_select_db($db);

  /* prepare the statement resource */
  $stmt=mssql_init($sproc, $con);

  if (isset($spparam))
  {
    mssql_bind($stmt, '@MachineName',    $spparam,  SQLVARCHAR);
  }

  /* now execute the procedure */
  if ($result = mssql_execute($stmt))
  {
    return $result;
  }
  else
  {
    return NULL;
  }
}

function GetMachineTotalStorageInTBRender( $input, $args, $parser )
{
    $parser->disableCache();

    $output = "";

    $result = RetrieveFromDatabase("TotalDriveSpaceByMachine", $input);
  if ($result)
  {
    while($row = mssql_fetch_array($result))
    {
      // Assign Variables
      $TotalTB = $row["TB"];
      if(!is_null($TotalTB))
      {
        // Print Variables in Table
        $output = $TotalTB." TB";
      }
    } // End While Loop
  } // End If

    return $output;
}
4

2 回答 2

1

首先,在错误抑制中包围 mysql_connect() 调用,如下所示:

wfSuppressWarnings();
$con = mssql_connect ($host, $usr, $pwd);
wfRestoreWarnings();

其次,检查 $con 并尽早退出以防止致命。

于 2012-05-27T07:14:34.663 回答
1

感谢 MaxSem 和 Samuel Lampa 的帮助。答案(至少对我来说)是将连接到数据库部分包装在 try catch 中,这允许尝试连接并且当它未能优雅地退出时。它可能应该向用户和/或日志报告错误,但这仅适用于我的家庭使用,所以没什么大不了的。

function RetrieveFromDatabase( $sproc, $spparam )
{
    $usr =  "usr";
    $pwd =  "pwd";
    $db =   "BGInfo";
    $host = "server";
    $output = "";

  try
  {
    // connect to database
    $con = mssql_connect ($host, $usr, $pwd);
  }
  catch(ExprError $e)
  {
      return NULL;
  }

  if (!$con)
  {
      return;
  }

  try
  {
    mssql_select_db($db);
  }
  catch(ExprError $e)
  {
      return NULL;
  }

  /* prepare the statement resource */
  $stmt=mssql_init($sproc, $con);

  if (isset($spparam))
  {
    mssql_bind($stmt, '@MachineName',    $spparam,  SQLVARCHAR);
  }

  /* now execute the procedure */
  if ($result = mssql_execute($stmt))
  {
    return $result;
  }
  else
  {
    return NULL;
  }
}

function GetMachineTotalStorageInTBRender( $input, $args, $parser )
{
    $parser->disableCache();

    $output = "";

    $result = RetrieveFromDatabase("TotalDriveSpaceByMachine", $input);
  if ($result)
  {
    while($row = mssql_fetch_array($result))
    {
      // Assign Variables
      $TotalTB = $row["TB"];
      if(!is_null($TotalTB))
      {
        // Print Variables in Table
        $output = $TotalTB." TB";
      }
    } // End While Loop
  } // End If

    return $output;
}
于 2014-01-03T23:08:52.663 回答