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
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
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.1k
LaravelとAWSで_漸進的なプロダクト開発
kazuhei0108
0
170
モックの泥沼から脱却するために、あえてDBにつないでテストしている話
kazuhei0108
4
3.5k
サービスコンテナの実践的な活用
kazuhei0108
1
1.2k
クラスを使ってLaravelのviewをキレイにする
kazuhei0108
1
1.7k
自分のLaravel アプリケーション設計晒す
kazuhei0108
0
100
Composerのstabilityの話
kazuhei0108
0
73
Other Decks in Programming
See All in Programming
代数的データ型って何が嬉しいの? #frontend_phpcon_do
kajitack
8
3.8k
脅威をエンジニアリングの糧にして――現場編 / Turning Threats into Engineering Fuel — Field Edition
nrslib
0
290
Hunting Vulnerabilities in Symfony with LLMs
vinceamstoutz
0
560
Dataformのリポジトリを立ち上げるときにまずやること / dataform-day0-2026
snhryt
0
180
決定論的オーケストレーションの設計と実装 / Design and Implementation of Deterministic Orchestration
nrslib
4
1.5k
AIを活用したE2Eテスト実装効率化のあゆみ / ebisu-mobile-14-kotetu
kotetuco
0
130
DynamoDBには集計系のクエリがないけどなんとかしたい
musan
1
180
Javaの型とAI時代に型が大事な理由 / java types and type in AI era
kishida
2
150
エンジニア向け会社紹介/Findy Company Profile
findyinc
6
350k
Claspは野良GASの夢をみるか
takter00
0
200
Performance Engineering for Everyone
elenatanasoiu
0
200
AI 時代のソフトウェア設計の学び方
masuda220
PRO
29
13k
Featured
See All Featured
What’s in a name? Adding method to the madness
productmarketing
PRO
24
4.1k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
234
17k
Visual Storytelling: How to be a Superhuman Communicator
reverentgeek
2
560
A Guide to Academic Writing Using Generative AI - A Workshop
ks91
PRO
1
330
A better future with KSS
kneath
240
18k
The Invisible Side of Design
smashingmag
301
52k
Building a A Zero-Code AI SEO Workflow
portentint
PRO
0
600
Ten Tips & Tricks for a 🌱 transition
stuffmc
0
140
Lightning talk: Run Django tests with GitHub Actions
sabderemane
0
200
Bioeconomy Workshop: Dr. Julius Ecuru, Opportunities for a Bioeconomy in West Africa
akademiya2063
PRO
1
150
Visualization
eitanlees
152
17k
How To Stay Up To Date on Web Technology
chriscoyier
790
250k
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Λॻ͖͑Δ͚ͩͰɺ༷ʑͳ݅ʹ ߹ΘͤͯΧελϚΠζ͢Δ͜ͱ͕ՄೳͰ͢ʂ