我想在我的Silex应用程序中捕获错误和异常,将它们包装在一个自定义的JSON响应中,该响应将始终返回给客户端.我找到了三种基本方法:
$app->error()
Symfony\Component\Debug\ErrorHandler::register();
Symfony\Component\Debug\ExceptionHandler::register();
Run Code Online (Sandbox Code Playgroud)
虽然我能够使用error()我的php错误来捕获控制器异常 - 但它们总是在xdebug中结束.我还没有理解如何error()与ExceptionHandler::register()每个其他-我需要两个互动?如何确保我的error()回复是JSON?
我现在有以下示例代码:
use Silex\Application;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
class Router extends Silex\Application
{
function __construct() {
parent::__construct();
// routes
$this->match('/{context}', array($this, 'handler'));
// error handler
$this->error(function(\Exception $e, $code) {
return $this->json(array("error" => $e->getMessage()), $code);
});
}
function handler(Request $request, $context) {
// throw new \Exception('test'); // exception- this is caught
$t = new Test(); // error- this is not caught
return 'DONE';
}
}
Symfony\Component\Debug\ErrorHandler::register();
$app = new Router();
$app->run();
Run Code Online (Sandbox Code Playgroud)
小智 5
使用ErrorHandler :: register(); 你可以像异常一样抓住你的错误
例
use Symfony\Component\Debug\ExceptionHandler;
use Symfony\Component\Debug\ErrorHandler;
///bla bla bla some code
//catch all errors and convert them to exceptions
ErrorHandler::register();
try {
//for example error happens here
trigger_error( 'OH MY GOD, I AM ON FIRE' );
} catch ( \Exception $e ) {
//for debugging you can do like this
$handler = new ExceptionHandler();
$handler->handle( $e );
/*
* ExceptionHendler class comments
* It is mostly useful in debug mode to replace the default PHP/XDebug
* output with something prettier and more useful.
* so i suggest to create json response
* and replace this code $handler = new ExceptionHandler();
* $handler->handle( $e );
*/
return new JsonResponse(
array(
'status' => 'error',
'message' => $e->getMessage()
)
);
}
Run Code Online (Sandbox Code Playgroud)
用silex你可以做下一件事
ErrorHandler::register();
//register an error handler
$app->error(function ( \Exception $e, $code ) use ($app) {
//return your json response here
$error = array( 'message' => $e->getMessage() );
return $app->json( $error, 200 );
});
Run Code Online (Sandbox Code Playgroud)