2012-01-05 82 views
1

在AJAX請求我目前正在處理錯誤類似於這樣的方式:PHP AJAX錯誤處理

try { 
    // code 

    if (some_error_condition) { 
     throw new \Exception('error'); 
    } 

    // other code 

    if (some_other_error_condition) { 
     throw new \Exception('other error'); 
    } 

    // more code 

    $response = array(
     'success' => TRUE, 
     'data' => 'stuff here' 
    ); 
} catch (Exception $e) { 
    $response = array(
     'success' => FALSE, 
     'error' => $e->getMessage() 
    ); 
} 

header('Content-Type: application/json'); 
echo json_encode($response); 

我的問題是:有沒有更好的方式來處理比這個多可能的錯誤情況,同時仍堅持乾的原則?我認爲這種方法比巨大的嵌套if/else錯誤更加清晰和易於遵循,但它有點讓人想起goto代碼。

也許是一種面向對象的方式?

+0

你使用任何庫嗎?大多數框架(jQuery,Mootools等)都會有onSuccess/onFailure方法,您可以使用它們而無需重新發明輪子。 – julio 2012-01-05 21:19:35

+0

@julio:我對如何處理PHP中的錯誤感興趣,而不是JavaScript。 – FtDRbwLXw6 2012-01-05 21:20:43

+1

看看[這裏](http://stackoverflow.com/questions/8698057/jquery-ajax-fail-and-return-exception/8698477#8698477) – devdRew 2012-01-05 21:20:55

回答

2

這對我來說是完全有效的解決方案,除了可以使用不同的異常類的異常,並封裝實際的邏輯在一些物體,比如

class Handler { 
     //this function executes code and throws exception - no error handling logic. 
    public static function doSomeCode() { 
     (...) 
     return $response; 
    } 
} 

try { 
    $response = Handler::doSomeCode(); 
    renderResponse(); 
} catch (SomeError $e) { 
    $err = 'some error'; 
    renderError($err); 
} catch (Exception $e) { 
    header('500 Internal Server Error'); //this is pseudo code! 
} 

您的異常類(除通用除外)可以處理渲染錯誤,Exception類會觸發500次(它永遠不會發生)。這樣你可以將實際的代碼執行與錯誤處理分開,並且適當的異常對象模型不要重複錯誤處理。

+0

+1:完全同意。 – 2012-01-05 21:25:54

+0

有趣。你會爲每個相關的HTTP響應代碼(未授權,錯誤的請求等)有不同的自定義'Exception'類嗎?還是隻有一個來處理所有的代碼? – FtDRbwLXw6 2012-01-05 21:27:30

+0

它依賴於錯誤處理邏輯是否有所不同 - 只要它與我使用一個異常類(即HttpException)相同,當邏輯不同時,你總是可以重構它來分離它。 – 2012-01-05 21:29:01