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