2012-01-05 126 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