Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Laravelのエラーハンドリングをカスタマイズする
Search
Kazuhei Arai
December 16, 2020
Programming
520
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Laravelのエラーハンドリングをカスタマイズする
Kazuhei Arai
December 16, 2020
More Decks by Kazuhei Arai
See All by Kazuhei Arai
CTOがプロダクトを管轄して、変わり始めたスクラム開発
kazuhei0108
0
340
Predefined Interfacesを使って便利な独自クラスを作りましょう
kazuhei0108
0
3.2k
LaravelとAWSで_漸進的なプロダクト開発
kazuhei0108
0
170
モックの泥沼から脱却するために、あえてDBにつないでテストしている話
kazuhei0108
4
3.5k
サービスコンテナの実践的な活用
kazuhei0108
1
1.2k
クラスを使ってLaravelのviewをキレイにする
kazuhei0108
1
1.8k
自分のLaravel アプリケーション設計晒す
kazuhei0108
0
100
Composerのstabilityの話
kazuhei0108
0
76
Other Decks in Programming
See All in Programming
Embedded SREと共に達成した会員管理システムのAWS移行 - SRE NEXT 2026 ランチスポンサーセッション
niftycorp
PRO
1
2.6k
【やさしく解説 設計編 #0】DDDのコード、読めるのに分からない人へ
panda728
PRO
2
270
AI時代、エンジニアはどう育つのか -未経験エンジニアの成長を間近で見て考えたこと-
thasu0123
0
110
AI 輔助遺留系統現代化的經驗分享
jame2408
1
1.2k
Laravelで学ぶ Webアプリケーションチューニング入門/web_application_tuning_101
hanhan1978
4
600
どこまでゆるくて許されるのか
tk3fftk
0
490
ビデオ通話が繋がる0.2秒で何が起きているのか
supurazako
2
150
吝嗇家のためのAI活用 / AI development for miser - ChatGPT + Issue Driven Development
tooppoo
0
190
20260623_Loop Engineeringで自分の分身の問い合わせBotを作る
ryugen04
0
220
PHP初心者セッション2026 〜生成AIでは見えない裏側を知る:今だからLAMPを通して仕組みを学ぶ〜
kashioka
0
460
ITヒヤリハットを整理してみた ~ライフサイクルと原因から考える再発防止策~
koukimiura
1
110
AI駆動開発を妨げる技術的負債の解消アプローチ / ai-refactoring-approach
minodriven
17
9.1k
Featured
See All Featured
Max Prin - Stacking Signals: How International SEO Comes Together (And Falls Apart)
techseoconnect
PRO
0
200
sira's awesome portfolio website redesign presentation
elsirapls
0
300
From Legacy to Launchpad: Building Startup-Ready Communities
dugsong
0
260
A brief & incomplete history of UX Design for the World Wide Web: 1989–2019
jct
2
420
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
38
2.9k
4 Signs Your Business is Dying
shpigford
187
22k
Typedesign – Prime Four
hannesfritz
42
3.1k
Reflections from 52 weeks, 52 projects
jeffersonlam
356
21k
The #1 spot is gone: here's how to win anyway
tamaranovitovic
3
1.1k
Building a Scalable Design System with Sketch
lauravandoore
463
34k
The Art of Programming - Codeland 2020
erikaheidi
57
14k
How to Think Like a Performance Engineer
csswizardry
28
2.7k
Transcript
!LB[VIFJ !LB[VIFJ@@ -BSBWFMͷΤϥʔϋϯυϦϯάΛ ΧελϚΠζ͢Δ ʲγϡʔϚΠʳ5FDI-FBE&OHJOFFS͔Β࠷৽ٕज़Λֶʂ-BSBWFMฤ
ࣗݾհ ߥҪฏ!LB[VIFJ גࣜձࣾ."Ϋϥυ$50 ീஸງελʔτΞοϓ
ς Ϋ ϊ ϩ δ ʔ ͷ ྗ Ͱ M
& A ʹ ྲྀ ௨ ֵ ໋ Λ
."ͷϦΫφϏͷΑ͏ͳαʔϏε ങ͍खاۀ͕ങऩχʔζΛܝࡌ͠ɺ ചΓख͕ͦΕʹରͯ͠ਃ͠ࠐΉͱ͍͏ܗͷ ৽͍͠.ˍ"ϚονϯάϓϥοτϑΥʔϜ
͍ͬͯΔٕज़ɾπʔϧ GSPOUFOE CBDLFOE NJEEMFXBSF JOGSB UPPMT
None
࣍ w 1)1ͷ&YDFQUJPO w -BSBWFMͷϦΫΤετ͔ΒϨεϙϯε·ͰͷྲྀΕ w ΤϥʔϋϯυϦϯάͷྲྀΕ w ΧελϚΠζྫ w
·ͱΊ
1)1ͷ&YDFQUJPO
1)1ͷ&YDFQUJPO 1)1ʹ&YDFQUJPOͱ&SSPSͷछྨͷྫ֎͕͋Γ·͢ɻ ྆ํͱ͕5ISPXBCMFΛܧঝ͍ͯ͠·͢ɻ 5ISPXBCMF &SSPS &YDFQUJPO 5ZQF&SSPS 3VOUJNF&YDFQUJPO &SSPS&YDFQUJPO "SJUINFUJD&SSPS
1)1ͷ&YDFQUJPO &SSPS&YDFQUJPOͱ͍͏͔ΓͮΒ͍ͷ͋Γ·͕͢ɺ ͜Ε&YDFQUJPOͰ͢ɻޙͰग़͖ͯ·͢ɻ 5ISPXBCMF &SSPS &YDFQUJPO 5ZQF&SSPS 3VOUJNF&YDFQUJPO &SSPS&YDFQUJPO "SJUINFUJD&SSPS
1)1ͷ&YDFQUJPO 1)1ͷݴޠϨϕϧͰͷΤϥʔେ͕&SSPSΛܧঝ͍ͯ͠· ͢ɻΑͬͯUSZDBUDIͰ&YDFQUJPOͱͯ͠DBUDI͠Α͏ͱͯ͠ ΩϟονͰ͖·ͤΜɻ 5ISPXBCMF &SSPS &YDFQUJPO 5ZQF&SSPS 3VOUJNF&YDFQUJPO &SSPS&YDFQUJPO
"SJUINFUJD&SSPS
1)1ͷ&YDFQUJPO &SSPS&YDFQUJPOͰͳ͍ͷͰ5ISPXBCMFͱͯ͠$BUDI <?php /** * Handle an incoming HTTP request.
* * @param \Illuminate\Http\Request $request * @return \Illuminate\Http\Response */ public function handle($request) { try { throw new SomeException(); } catch (Exception $e) { // ExceptionͷΈCatch } catch (Throwable $e) { // ExceptionͱErrorͷ྆ํΛCatch } }
-BSBWFMͷ ΤϥʔϋϯυϦϯάͷྲྀΕ
ΤϥʔϋϯυϦϯά·ͰͷྲྀΕ ͥͻ͓खݩͷ1)14UPSN͔Կ͔Ͱ-BSBWFMͷ1SPKFDUΛ։͍ ͯɺϑΝΠϧΛݟͳ͕Βฉ͍ͯΈ͍ͯͩ͘͞ɻ
ΤϥʔϋϯυϦϯά·ͰͷྲྀΕ QVCMJDJOEFYQIQͰ,FSOFMΛੜ͠,FSOFMIBOEMF Λ࣮ߦ <?php /** * Laravel - A PHP
Framework For Web Artisans * * @package Laravel * @author Taylor Otwell <
[email protected]
> */ define('LARAVEL_START', microtime(true)); /** ུ **/ $kernel = $app->make(Illuminate\Contracts\Http\Kernel::class); $response = $kernel->handle( $request = Illuminate\Http\Request::capture() ); $response->send(); $kernel->terminate($request, $response);
ΤϥʔϋϯυϦϯά·ͰͷྲྀΕ *MMVNJOBUFa'PVOEBUJPOa)UUQa,FSOFMIBOEMFͰ &YDFQUJPOɺ5ISPXBCMFΛर͏ <?php /** লུ **/ public function handle($request)
{ try { $request->enableHttpMethodParameterOverride(); $response = $this->sendRequestThroughRouter($request); } catch (Exception $e) { $this->reportException($e); $response = $this->renderException($request, $e); } catch (Throwable $e) { $this->reportException($e = new FatalThrowableError($e)); $response = $this->renderException($request, $e); } $this->app['events']->dispatch( new RequestHandled($request, $response) ); return $response; }
ΤϥʔϋϯυϦϯά·ͰͷྲྀΕ &SSPS'BUBM5ISPXBCMF&SSPSͱ͍͏໊લͷ &SSPS&YDFQUJPOʹม͍ͯ͠Δ <?php /** লུ **/ public function handle($request)
{ try { $request->enableHttpMethodParameterOverride(); $response = $this->sendRequestThroughRouter($request); } catch (Exception $e) { $this->reportException($e); $response = $this->renderException($request, $e); } catch (Throwable $e) { $this->reportException($e = new FatalThrowableError($e)); $response = $this->renderException($request, $e); } $this->app['events']->dispatch( new RequestHandled($request, $response) ); return $response; }
ΤϥʔϋϯυϦϯά·ͰͷྲྀΕ ͭ·Γɺ-BSBWFMͷ࣮ߦ࣌ʹൃੜͨ͠&SSPS࠷ऴతʹ શͯ&YDFQUJPOʹม͞Ε͔ͯΒॲཧ͞ΕΔ <?php /** লུ **/ public function handle($request)
{ try { $request->enableHttpMethodParameterOverride(); $response = $this->sendRequestThroughRouter($request); } catch (Exception $e) { $this->reportException($e); $response = $this->renderException($request, $e); } catch (Throwable $e) { $this->reportException($e = new FatalThrowableError($e)); $response = $this->renderException($request, $e); } $this->app['events']->dispatch( new RequestHandled($request, $response) ); return $response; }
ΤϥʔϋϯυϦϯά·ͰͷྲྀΕ <?php /** লུ **/ /** * Report the exception
to the exception handler. * * @param \Exception $e * @return void */ protected function reportException(Exception $e) { $this->app[ExceptionHandler::class]->report($e); } /** * Render the exception to a response. * * @param \Illuminate\Http\Request $request * @param \Exception $e * @return \Symfony\Component\HttpFoundation\Response */ protected function renderException($request, Exception $e) { return $this->app[ExceptionHandler::class]->render($request, $e); } ΤϥʔϋϯυϦϯά&YDFQUJPO)BOEMFSDMBTTͷ࣮͕ߦ͏
ΤϥʔϋϯυϦϯά·ͰͷྲྀΕ <?php /** লུ **/ $app->singleton( Illuminate\Contracts\Debug\ExceptionHandler::class, App\Exceptions\Handler::class ); return
$app; &YDFQUJPO)BOEMFSDMBTTͷ࣮ CPPUTUSBQBQQQIQͰࢦఆ͞Ε͍ͯΔ
ΤϥʔϋϯυϦϯάͷྲྀΕ
ΤϥʔϋϯυϦϯάͷྲྀΕ ΤϥʔϋϯυϦϯάͷྲྀΕେ͖͘ ɾΤϥʔϨϙʔτ ɾΤϥʔදࣔ ͷͭͷϑΣʔζʹ͔Ε͍ͯ·͢ɻ͜ΕΒ *MMVNJOBUFa'PVOEBUJPOa&YDFQUJPOTa)BOEMFSQIQʹ࣮ ͞Ε͍ͯ·͢ɻ
ΤϥʔϋϯυϦϯάͷྲྀΕ )BOEMFSSFQPSU ԿΛϨϙʔτ͢Δ͔ܾΊΔ Ϩϙʔτ͢Δ &YDFQUJPOΛ४උ͢Δ &YDFQUJPOΛදࣔ͢Δ )BOEMFSSFOEFS
ΤϥʔϋϯυϦϯάͷྲྀΕ )BOEMFSSFQPSU )BOEMFSTIPVMEOU3FQPSU MPHHFSFSSPS )BOEMFSQSFQBSF&YDFQUJPO )BOEMFSQSFQBSF3FTQPOTF )BOEMFSSFOEFS
ΤϥʔϋϯυϦϯάͷྲྀΕ <?php /** লུ **/ protected function prepareResponse($request, Exception $e)
{ if (! $this->isHttpException($e) && config('app.debug')) { return $this->toIlluminateResponse($this- >convertExceptionToResponse($e), $e); } if (! $this->isHttpException($e)) { $e = new HttpException(500, $e->getMessage()); } return $this->toIlluminateResponse( $this->renderHttpException($e), $e ); } σϑΥϧτͷQSFQBSF3FTQPOTFʹ&YDFQUJPOΛड͚औͬͯ ඳը͢Δ࠷ݶͷॲཧ͕ॻ͍ͯ͋Δ
ΤϥʔϋϯυϦϯάͷྲྀΕ 4ZNGPOZa$PNQPOFOUa)UUQ,FSOFMa&YDFQUJPOa)UUQ&YDFQUJPOΛܧ ঝ͍ͯ͠ΔΫϥεશͯJT)UUQ&YDFQUJPOʹ֘͠ɺ-BSBWFM͕͍͍ײ ͡ʹมͯ͘͠Ε·͢ɻ ྫ/PU'PVOE)UUQ&YDFQUJPO #BE3FRVFTU)UUQ&YDFQUJPO
ΤϥʔϋϯυϦϯάͷྲྀΕ ͜ΕΒͷॲཧͱͱ *MMVNJOBUFa'PVOEBUJPOa&YDFQUJPOTa)BOEMFSQIQʹ࣮͞ Ε͍ͯ·͕͢ɺ"QQa&YDFQUJPOTa)BOEMFSQIQ͕ܧঝؔ ʹ͋ΔͷͰ؆୯ʹ্ॻ͖͢Δ͜ͱ͕ՄೳͰ͢ɻ
ΧελϚΠζྫ
ΧελϚΠζྫ w ಛఆͷ&YDFQUJPOΛϩάʹग़͞ͳ͘͢Δ w ಠࣗͷ&YDFQUJPOͰطଘͷΤϥʔදࣔΛ͢Δ w ΤϥʔදࣔͷWJFXΛΧελϚΠζ͢Δ
ಛఆͷ&YDFQUJPOΛϩάʹग़͞ͳ͘͢Δ )BOEMFSSFQPSU )BOEMFSTIPVMEOU3FQPSU MPHHFSFSSPS )BOEMFSQSFQBSF&YDFQUJPO )BOEMFSQSFQBSF3FTQPOTF )BOEMFSSFOEFS
ಛఆͷ&YDFQUJPOΛϩάʹग़͞ͳ͘͢Δ EPOU3FQPSUΛࢦఆͯ͠ϩάʹग़͞ͳ͍ <?php namespace Illuminate\Foundation\Exceptions; /** ུ **/ class Handler
extends ExceptionHandler { /** ུ **/ protected function shouldntReport(Exception $e) { $dontReport = array_merge($this->dontReport, $this->internalDontReport); return ! is_null(Arr::first($dontReport, function ($type) use ($e) { return $e instanceof $type; })); }
ಛఆͷ&YDFQUJPOΛϩάʹग़͞ͳ͘͢Δ EPOU3FQPSUΛࢦఆͯ͠ϩάʹग़͞ͳ͍ <?php namespace App\Exceptions; /** ུ **/ class Handler
extends ExceptionHandler { /** * A list of the exception types that are not reported. * * @var array */ protected $dontReport = [ PreconditionException::class, NotFoundException::class, ];
ಠࣗͷ&YDFQUJPOͰطଘͷΤϥʔදࣔΛ͢Δ )BOEMFSSFQPSU )BOEMFSTIPVMEOU3FQPSU MPHHFSFSSPS )BOEMFSQSFQBSF&YDFQUJPO )BOEMFSQSFQBSF3FTQPOTF )BOEMFSSFOEFS
ಠࣗͷ&YDFQUJPOͰطଘͷΤϥʔදࣔΛ͢Δ )UUQ&YDFQUJPOΛܧঝͨ͠Ϋϥεʹม͢Δ <?php namespace App\Exceptions; /** ུ **/ class Handler
extends ExceptionHandler { protected function prepareException(Exception $e) { $e = parent::prepareException($e); if ($e instanceof NotFoundException) { $e = new NotFoundHttpException($e->getMessage(), $e); } if ($e instanceof PreconditionException) { $e = new AccessDeniedHttpException($e->getMessage(), $e); } return $e; }
ΤϥʔදࣔͷWJFXΛΧελϚΠζ͢Δ )BOEMFSSFQPSU )BOEMFSTIPVMEOU3FQPSU MPHHFSFSSPS )BOEMFSQSFQBSF&YDFQUJPO )BOEMFSQSFQBSF3FTQPOTF )BOEMFSSFOEFS
ΤϥʔදࣔͷWJFXΛΧελϚΠζ͢Δ <?php namespace App\Exceptions; /** ུ **/ class Handler extends
ExceptionHandler { protected function prepareResponse($request, Exception $e) { return $this->toIlluminateResponse( $this->customRenderHttpException($request, $e), $e ); } private function customRenderHttpException(Request $request, HttpException $e) { $status = $e->getStatusCode(); $paths = collect(config('view.paths')); view()->replaceNamespace('errors', $paths->map(function ($path) use ($request) { if ($request->is('admin/*')) { return "{$path}/admin/errors"; } return "{$path}/service/errors"; })->push(__DIR__ . '/views')->all()); if (view()->exists($view = "errors::{$status}")) { return response()->view($view, ['exception' => $e], $status, $e->getHeaders()); } return $this->convertExceptionToResponse($e); }
·ͱΊ
·ͱΊ -BSBWFMͷΤϥʔϋϯυϦϯάͭͷϑΣʔζʹ͔Ε͓ͯ ΓɺͦΕͧΕܧঝՄೳͳؔͰ࣮͞Ε͍ͯΔͨΊɺBQQ &YDFQUJPO)BOEMFSQIQΛॻ͖͑Δ͚ͩͰɺ༷ʑͳ݅ʹ ߹ΘͤͯΧελϚΠζ͢Δ͜ͱ͕ՄೳͰ͢ʂ