Slim / 3.3.0에 대한 사용자 지정 오류 처리기를 작성 중이며 오류와 예외를 모두 처리하기 위해 동일한 코드를 재사용 할 가치가 있는지 알아 보려고합니다. 이를 위해 오류를 ErrorException
인스턴스 로 변환하는 사용자 지정 오류 처리기를 정의했습니다 .
require __DIR__ . '/../vendor/autoload.php';
set_error_handler (function ($errno, $errstr, $errfile, $errline) {
if (!(error_reporting() & $errno)) {
return true; // Do not run built-in handler
}
throw new \ErrorException($errstr, 0, $errno, $errfile, $errline);
});
$app = new \Slim\App(['settings' => ['displayErrorDetails' => false]]);
$container = $app->getContainer();
// [...]
$container['errorHandler'] = function (Slim\Container $c) {
return new App\Handlers\Error($c->logger, $c['settings']['displayErrorDetails']);
};
그런 다음 잡히지 않은 예외를 기록하고 / 또는 원하는대로 일반 "오류가 있습니다"페이지를 표시 할 수 있습니다 (지금까지는 괜찮습니다).
하지만 이제는 사소한 문제 ( E_WARNING
, E_NOTICE
등)를 다르게 처리하고 싶습니다 . 모든 것을 중단하고 일반 오류 페이지 템플릿을 표시하는 대신 실행을 계속하거나 오류 메시지를 인라인으로 표시 할 수 있기를 원합니다 (PHP와 마찬가지로 기본값) 그리고 여기에 내가 잃어버린 곳이 있습니다. 디스플레이 인라인 부분은 간단하지만 내 스크립트를 바로 중단 :
namespace App\Handlers;
use Psr\Http\Message\ServerRequestInterface as Request;
use Psr\Http\Message\ResponseInterface as Response;
final class Error extends \Slim\Handlers\Error
{
public function __invoke(Request $request, Response $response, \Exception $e)
{
if ($this->displayErrorDetails) {
$response->write($e);
} else {
$this->saveToLog($e);
$response->write('[ERROR]');
}
if ($this->isFatal($e)) {
// Aborts scripts and displays error page (OK)
return parent::__invoke($request, $response, $e);
} else {
// Seems to abort script (nothing else is shown from this poing)
return $response;
}
}
}
...이 방법으로 테스트 :
$app->get('/warning-test', function (Request $request, Response $response) {
$this->logger->info("Loading {$_SERVER['REQUEST_URI']}");
$response->write('<h1>Warning test page</h1>');
$response->write('<p>About to generate a warning:</p>');
$this->logger->info("Generating warning...");
1/0;
$this->logger->info("Warning generated");
$response->write('<p>This should display as well.</p>');
// ... but it doesn't. Probably because Response is immutable and my copy
// was superseded by a clone
return $response;
});
내 옵션은 무엇입니까?
이 set_error_handler()
함수는 오류 유형을 두 번째 매개 변수로 E_ERROR
사용하므로 사용자 지정 오류 처리기 만 사용하도록 지정할 수 있습니다 .
$errorTypes = E_ERROR;
set_error_handler (function ($errno, $errstr, $errfile, $errline) {
if (!(error_reporting() & $errno)) {
return true; // Do not run built-in handler
}
throw new \ErrorException($errstr, 0, $errno, $errfile, $errline);
}, $errorTypes);
알림과 경고를 스스로 처리하고 싶을 때는 기본적으로 정상적인 경로를 취소하고 오류 응답 만 받기 때문에 Exception을 던질 수 없습니다. 다음과 같이 예외를 발생시키지 않고이를 수행 할 수 있습니다.
$errorTypes = E_WARNING | E_NOTICE;
set_error_handler (function ($errno, $errstr, $errfile, $errline) {
if (!(error_reporting() & $errno)) {
return true; // Do not run built-in handler
}
\App\Handlers\Error::setNoticeOrWarning($errno, $errstr, $errfile, $errline);
}, $errorTypes);
그런 다음 나중에 미들웨어에서 확인하고이를 표시 할 수 있습니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다