Laravelの例外は何ですか

青灯夜游
リリース: 2022-06-28 17:53:33
オリジナル
2707 人が閲覧しました

laravel の例外には次のものが含まれます: 1. 「E_ERROR」致命的なランタイム エラー。回復不可能であり、スクリプトが終了して実行を続行できなくなります。2. 「E_WARNING」ランタイム警告「致命的ではないエラー」。3. .「E_PARSE」コンパイル時構文解析エラー、4.「E_CORE_ERROR」初期化および起動時に発生する致命的なエラー、5.「E_COMPILE_ERROR」致命的なコンパイル時エラー、6.「E_RECOVERABLE_ERROR」キャプチャ可能な致命的なエラー。

Laravelの例外は何ですか

このチュートリアルの動作環境: Windows 7 システム、Laravel 9 バージョン、DELL G3 コンピューター。

#laravel の例外レベル

定数説明E_ERROR致命的な実行時エラー。このタイプのエラーは、メモリ割り当てによって引き起こされる問題など、通常は回復不可能な状況です。その結果、スクリプトが終了し、実行が続行されなくなります。 E_WARNING実行時警告 (致命的ではないエラー)。プロンプト メッセージのみが表示されますが、スクリプトは終了しません。 E_PARSEコンパイル時の構文解析エラー。解析エラーはパーサーによってのみ生成されます。 E_NOTICE実行時通知。スクリプトでエラーとして表示される可能性のある状況が発生したことを示しますが、正常に実行できるスクリプトでも同様の通知が表示される可能性があります。 E_CORE_ERRORPHP の初期化の起動中に致命的なエラーが発生しました。このエラーは E_ERROR に似ていますが、PHP エンジン コアによって生成されます。 E_CORE_WARNINGPHP の初期化の起動中に警告 (致命的ではないエラー) が発生しました。 E_WARNING と似ていますが、PHP エンジン コアによって生成されます。 E_COMPILE_ERROR致命的なコンパイル時エラー。 E_ERROR に似ていますが、Zend スクリプト エンジンによって生成されます。 E_COMPILE_WARNINGコンパイル時の警告 (致命的ではないエラー)。 E_WARNING と似ていますが、Zend スクリプト エンジンによって生成されます。 E_USER_ERROR ユーザーが生成したエラー メッセージ。 E_ERROR に似ていますが、コード内で PHP 関数trigger_error () を使用するユーザーによって生成されます。 E_USER_WARNINGユーザーによって生成された警告メッセージ。 E_WARNING と似ていますが、コード内で PHP 関数trigger_error () を使用するユーザーによって生成されます。 E_USER_NOTICEユーザーによって生成された通知情報。 E_NOTICE に似ていますが、コード内で PHP 関数trigger_error () を使用してユーザーによって生成されます。 E_STRICTPHP のコード変更の提案を有効にして、コードの最高の相互運用性と上位互換性を確保します。 E_RECOVERABLE_ERRORキャッチできる可能性のある致命的なエラー。これは、潜在的に危険なエラーが発生したが、PHP エンジンがまだ不安定な状態になっていないことを示します。エラーがユーザー定義のハンドラー (set_error_handler () を参照) によって捕捉されない場合、E_ERROR となり、スクリプトは終了します。 E_DEPRECATED実行時通知。有効にすると、将来のバージョンで正しく動作しなくなる可能性があるコードについて警告が表示されます。 E_USER_DEPRECATED ユーザーが生成した警告メッセージ。 E_DEPRECATED と似ていますが、コード内で PHP 関数trigger_error () を使用してユーザーによって生成されます。 #E_ALL

Laravel 例外処理

Laravel の例外処理は、クラス \Illuminate\Foundation\Bootstrap\HandleExceptions::class:

class HandleExceptions
{
    public function bootstrap(Application $app)
    {
        $this->app = $app;

        error_reporting(-1);

        set_error_handler([$this, 'handleError']);

        set_exception_handler([$this, 'handleException']);

        register_shutdown_function([$this, 'handleShutdown']);

        if (! $app->environment('testing')) {
            ini_set('display_errors', 'Off');
        }
    }
}
ログイン後にコピー

## によって完了します。 # 例外変換

Laravel の例外処理はすべて handleException 関数によって処理されます。

PHP7 はグローバルなスロー可能なインターフェイスを実装しており、オリジナルの例外と一部のエラーはこのインターフェイスを実装しており、インターフェイスの形式で例外の継承構造を定義しています。その結果、PHP7 ではより多くのエラーがキャッチ可能な例外となって開発者に返され、キャッチされなかった場合はエラー、キャッチされた場合はプログラム内で処理できる例外となるようになりました。これらの捕捉可能なエラーは、通常、存在しない関数など、プログラムに致命的な害を及ぼさないエラーです。

PHP7 では、/Error 例外に基づいて、ArithmeticError / AssertionError / DivisionByZeroError / ParseError / TypeError という 5 つの新しいエンジン例外が派生します。 PHP7 では、古い /Exception と新しい /Error の両方が共通インターフェイス /Throwable を実装します。

したがって、非 Exception タイプの例外が発生した場合は、まずそれを FatalThrowableError タイプに変換する必要があります:

public function handleException($e)
{
    if (! $e instanceof Exception) {
        $e = new FatalThrowableError($e);
    }

    $this->getExceptionHandler()->report($e);

    if ($this->app->runningInConsole()) {
        $this->renderForConsole($e);
    } else {
        $this->renderHttpResponse($e);
    }
}
ログイン後にコピー

FatalThrowableError は、Symfony が継承するエラー例外クラスです \ErrorException:

class FatalThrowableError extends FatalErrorException
{
    public function __construct(\Throwable $e)
    {
        if ($e instanceof \ParseError) {
            $message = 'Parse error: '.$e->getMessage();
            $severity = E_PARSE;
        } elseif ($e instanceof \TypeError) {
            $message = 'Type error: '.$e->getMessage();
            $severity = E_RECOVERABLE_ERROR;
        } else {
            $message = $e->getMessage();
            $severity = E_ERROR;
        }

        \ErrorException::__construct(
            $message,
            $e->getCode(),
            $severity,
            $e->getFile(),
            $e->getLine()
        );

        $this->setTrace($e->getTrace());
    }
}
ログイン後にコピー

例外ログ

異常事態が発生した場合、laravelはまずログを記録するのがレポート機能の役割です。 Ioc コンテナ内の

protected function getExceptionHandler()
{
    return $this->app->make(ExceptionHandler::class);
}
ログイン後にコピー

laravel のデフォルトの例外処理クラスは Illuminate\Foundation\Exceptions\Handler:

class Handler implements ExceptionHandlerContract
{
    public function report(Exception $e)
    {
        if ($this->shouldntReport($e)) {
            return;
        }
        try {
            $logger = $this->container->make(LoggerInterface::class);
        } catch (Exception $ex) {
            throw $e; // throw the original exception
        }
        $logger->error($e);
    }
    protected function shouldntReport(Exception $e)
    {
        $dontReport = array_merge($this->dontReport, [HttpResponseException::class]);
        return ! is_null(collect($dontReport)->first(function ($type) use ($e) {
            return $e instanceof $type;
        }));
    }
}
ログイン後にコピー

例外ページ表示

記録ログつまり、問題の原因を確認するには、例外をページに変換して開発者に例外情報を表示する必要があります。

protected function renderHttpResponse(Exception $e)
{
    $this->getExceptionHandler()->render($this->app['request'], $e)->send();
}
class Handler implements ExceptionHandlerContract
{
    public function render($request, Exception $e)
    {
        $e = $this->prepareException($e);
        if ($e instanceof HttpResponseException) {
            return $e->getResponse();
        } elseif ($e instanceof AuthenticationException) {
            return $this->unauthenticated($request, $e);
        } elseif ($e instanceof ValidationException) {
            return $this->convertValidationExceptionToResponse($e, $request);
        }
        return $this->prepareResponse($request, $e);
    }
}
ログイン後にコピー

例外ごとに、laravel は異なる処理を行います。大まかに HttpException が含まれます。 HttpResponseException、AuthorizationException、ModelNotFoundException、AuthenticationException、ValidationException。特定の例外にはそれぞれ異なるニーズがあるため、この記事では特にそれらを紹介しません。この記事では、最も一般的な例外 HttpException の処理について引き続き紹介します:

protected function prepareResponse($request, Exception $e)
{
    if ($this->isHttpException($e)) {
        return $this->toIlluminateResponse($this->renderHttpException($e), $e);
    } else {
        return $this->toIlluminateResponse($this->convertExceptionToResponse($e), $e);
    }
}
protected function renderHttpException(HttpException $e)
{
    $status = $e->getStatusCode();
    view()->replaceNamespace('errors', [
        resource_path('views/errors'),
        __DIR__.'/views',
    ]);
    if (view()->exists("errors::{$status}")) {
        return response()->view("errors::{$status}", ['exception' => $e], $status, $e->getHeaders());
    } else {
        return $this->convertExceptionToResponse($e);
    }
}
ログイン後にコピー

HttpException の場合、エラー ステータス コードに応じて、さまざまなエラー ページ テンプレートが選択されます。関連するテンプレートがない場合は、 SymfonyResponse Construct 例外表示ページ:

protected function convertExceptionToResponse(Exception $e)
{
    $e = FlattenException::create($e);
    $handler = new SymfonyExceptionHandler(config('app.debug'));
    return SymfonyResponse::create($handler->getHtml($e), $e->getStatusCode(), $e->getHeaders());
}
protected function toIlluminateResponse($response, Exception $e)
{
    if ($response instanceof SymfonyRedirectResponse) {
        $response = new RedirectResponse($response->getTargetUrl(), $response->getStatusCode(), $response->headers->all());
    } else {
        $response = new Response($response->getContent(), $response->getStatusCode(), $response->headers->all());
    }
    return $response->withException($e);
}
ログイン後にコピー
[関連する推奨事項:

laravel ビデオ チュートリアル]

ユーザーが生成した警告メッセージ。 E_DEPRECATED と似ていますが、コード内で PHP 関数trigger_error () を使用してユーザーによって生成されます。

以上がLaravelの例外は何ですかの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!