Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Laravelのエラーハンドリングをカスタマイズする
Search
Kazuhei Arai
December 16, 2020
Programming
530
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
350
Predefined Interfacesを使って便利な独自クラスを作りましょう
kazuhei0108
0
3.2k
LaravelとAWSで_漸進的なプロダクト開発
kazuhei0108
0
180
モックの泥沼から脱却するために、あえてDBにつないでテストしている話
kazuhei0108
4
3.5k
サービスコンテナの実践的な活用
kazuhei0108
1
1.2k
クラスを使ってLaravelのviewをキレイにする
kazuhei0108
1
1.8k
自分のLaravel アプリケーション設計晒す
kazuhei0108
0
110
Composerのstabilityの話
kazuhei0108
0
79
Other Decks in Programming
See All in Programming
App Intentsのビルドプロセスを支える技術
kntkymt
0
430
技術的負債を組織課題として解く-増えすぎたマイクロサービスとの戦い-
reimaru
1
2.3k
速く作れる。その次は、速く確かめられる開発へ 〜AIネイティブ開発を支える、Shift Down〜 / Can build fast. Next, moving to development where we can verify fast.
rkaga
5
4.4k
App Storeの外へ──日本のiOSサイドローディング入門 for iOSDC Japan 2026
yuukiw00w
0
240
What We Talk About When We Talk About XP
m_seki
2
680
Augmenting AI with the Power of Jakarta EE
ivargrimstad
0
310
Augmenting AI with the Power of Jakarta EE
ivargrimstad
0
260
Are APIs Still Relevant in the AI Era?
soyuka
0
300
setup-vp GitLab対応の裏側
naokihaba
0
120
アクセシビリティから考える情報設計
high_g_engineer
0
390
モバイル交通系ICへのチャージ実例から考える、クロスプラットフォーム開発におけるiOS実機テスト設計とCI運用
yusuga
1
540
Workers Cache を知る
syumai
0
210
Featured
See All Featured
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.8k
The #1 spot is gone: here's how to win anyway
tamaranovitovic
4
1.2k
Reflections from 52 weeks, 52 projects
jeffersonlam
356
21k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
52
6.1k
WENDY [Excerpt]
tessaabrams
14
39k
Test your architecture with Archunit
thirion
2
2.4k
Organizational Design Perspectives: An Ontology of Organizational Design Elements
kimpetersen
PRO
1
830
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
49
3.6k
Building Experiences: Design Systems, User Experience, and Full Site Editing
marktimemedia
1
610
Claude Code どこまでも/ Claude Code Everywhere
nwiizo
67
58k
Leveraging Curiosity to Care for An Aging Population
cassininazir
1
500
Reality Check: Gamification 10 Years Later
codingconduct
0
2.3k
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Λॻ͖͑Δ͚ͩͰɺ༷ʑͳ݅ʹ ߹ΘͤͯΧελϚΠζ͢Δ͜ͱ͕ՄೳͰ͢ʂ