如何处理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;
}
首先,在错误抑制中将 mysql_connect() 调用括起来,如下所示:
wfSuppressWarnings();
$con = mssql_connect ($host, $usr, $pwd);
wfRestoreWarnings();
其次,检查$con并尽早救助,以防止致命事故。
感谢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;
}