ErrorException에 대한 응답을 중단하지 마십시오.

알바로 곤잘레스

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

내 옵션은 무엇입니까?

jmattheis

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] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

rspec에서 json 응답 대신 리디렉션을 고안하십시오.

분류에서Dev

동일한`with` 안에 중첩 된 경우`with` 문을 실행하지 마십시오.

분류에서Dev

PHP의 요청에 응답하지 마십시오

분류에서Dev

$ http.get에서 응답을받을 때까지 페이지를 표시하지 마십시오.

분류에서Dev

500 개의 응답에 대해서만 전달을 다시 시도하십시오.

분류에서Dev

Chart JS에서 첫 번째 GridLine을 대시로 사용하지 마십시오.

분류에서Dev

ajax 응답은 좋지만 HTML에서 선택하지 마십시오.

분류에서Dev

“마일에 관한 모든 것”에 대한 단서를 구하십시오.

분류에서Dev

if 및 for를 사용하여 쉘 스크립트에 대한 출력을 얻지 마십시오.

분류에서Dev

QML에서 간단한 설정 호출로 배열을 저장하지 마십시오.

분류에서Dev

신뢰할 수있는 사이트에서 다운로드 한 파일을 차단하지 마십시오.

분류에서Dev

모든 콘텐츠에 대해 jquery 기능을 사용하지 마십시오.

분류에서Dev

pandas에서 동일한 .loc을 여러 번 작성하지 마십시오.

분류에서Dev

배열에서 동일한 항목을 출력하지 마십시오.

분류에서Dev

Spring Batch에서 동일한 파일을 두 번 처리하지 마십시오.

분류에서Dev

오류 목록에 대한 Ajax 응답을 확인하는 방법

분류에서Dev

Postman-필수 속성의 마지막 발생에 대한 JSON 응답에서 값을 가져 오는 방법

분류에서Dev

json 요청에 대한 응답 내용을 확인 하시겠습니까?

분류에서Dev

특정 위치에 대한 공허함으로 마지막 줄을 채우십시오.

분류에서Dev

WooCommerce에 알림을 표시하는 웹 서비스 실패 응답에 주문을 저장하지 마십시오.

분류에서Dev

Wisper-sidekiq로 대기열을 시작하지 마십시오.

분류에서Dev

스파크 라인 막대 차트의 막대 간격에 도구 설명을 표시하지 마십시오.

분류에서Dev

명령에 대한 응답을 반환하지 않는 코드

분류에서Dev

JAVA 개체에 대한 응답을 매핑하지 않는 Jersey

분류에서Dev

목록보기에서 애니메이션을 중지하지 마십시오

분류에서Dev

XCTAssertThrowsSpecific에서 테스트 실행을 중지하지 마십시오.

분류에서Dev

Docker에 하위 모듈을 게시하지 마십시오.

분류에서Dev

목록에 단락 사이에 간격을 적용하지 마십시오.

분류에서Dev

Websphere MQ에 대한 메시지가 응답을 수신하지 않음 (Fuse ESB 7.1)

Related 관련 기사

  1. 1

    rspec에서 json 응답 대신 리디렉션을 고안하십시오.

  2. 2

    동일한`with` 안에 중첩 된 경우`with` 문을 실행하지 마십시오.

  3. 3

    PHP의 요청에 응답하지 마십시오

  4. 4

    $ http.get에서 응답을받을 때까지 페이지를 표시하지 마십시오.

  5. 5

    500 개의 응답에 대해서만 전달을 다시 시도하십시오.

  6. 6

    Chart JS에서 첫 번째 GridLine을 대시로 사용하지 마십시오.

  7. 7

    ajax 응답은 좋지만 HTML에서 선택하지 마십시오.

  8. 8

    “마일에 관한 모든 것”에 대한 단서를 구하십시오.

  9. 9

    if 및 for를 사용하여 쉘 스크립트에 대한 출력을 얻지 마십시오.

  10. 10

    QML에서 간단한 설정 호출로 배열을 저장하지 마십시오.

  11. 11

    신뢰할 수있는 사이트에서 다운로드 한 파일을 차단하지 마십시오.

  12. 12

    모든 콘텐츠에 대해 jquery 기능을 사용하지 마십시오.

  13. 13

    pandas에서 동일한 .loc을 여러 번 작성하지 마십시오.

  14. 14

    배열에서 동일한 항목을 출력하지 마십시오.

  15. 15

    Spring Batch에서 동일한 파일을 두 번 처리하지 마십시오.

  16. 16

    오류 목록에 대한 Ajax 응답을 확인하는 방법

  17. 17

    Postman-필수 속성의 마지막 발생에 대한 JSON 응답에서 값을 가져 오는 방법

  18. 18

    json 요청에 대한 응답 내용을 확인 하시겠습니까?

  19. 19

    특정 위치에 대한 공허함으로 마지막 줄을 채우십시오.

  20. 20

    WooCommerce에 알림을 표시하는 웹 서비스 실패 응답에 주문을 저장하지 마십시오.

  21. 21

    Wisper-sidekiq로 대기열을 시작하지 마십시오.

  22. 22

    스파크 라인 막대 차트의 막대 간격에 도구 설명을 표시하지 마십시오.

  23. 23

    명령에 대한 응답을 반환하지 않는 코드

  24. 24

    JAVA 개체에 대한 응답을 매핑하지 않는 Jersey

  25. 25

    목록보기에서 애니메이션을 중지하지 마십시오

  26. 26

    XCTAssertThrowsSpecific에서 테스트 실행을 중지하지 마십시오.

  27. 27

    Docker에 하위 모듈을 게시하지 마십시오.

  28. 28

    목록에 단락 사이에 간격을 적용하지 마십시오.

  29. 29

    Websphere MQ에 대한 메시지가 응답을 수신하지 않음 (Fuse ESB 7.1)

뜨겁다태그

보관