2012-05-26 108 views
1

如何處理Mediawiki擴展中的錯誤條件?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; 
} 

回答

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; 
} 
1

首先,圍繞在錯誤抑制mysql_connect()函數調用是這樣的:

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

其次,檢查$ con並提前退出以防止致命錯誤。

+0

謝謝,wfSuppressWarnings和wfRestoreWarnings停止了日誌中的消息。 我試過了'if($ con)',但它仍然失敗,我在日誌中注意到一個致命的錯誤消息「最大執行時間超過60秒」,它看起來像是每個'$ con = mssql_connect($ host,$ usr,$ pwd)'調用。有沒有辦法處理連接周圍的時間? – IronBeard

+0

如何檢查「空($ con)」而不是? –