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
82
Other Decks in Programming
See All in Programming
AWS CDKのカスタムリソースでContinuum(旧Security Agent)を実装した話 | Implementing Continuum (formerly Security Agent) via AWS CDK Custom Resource
akihisaikeda
2
150
contenteditable と日本語入力に向き合う
colorful12
0
200
Kotlinの15年とServer-Side Kotlin
n_takehata
1
160
AIで開発が速くなった先で、開発チームは何を目指すか
shihochan
1
1.6k
Augmenting AI with the Power of Jakarta EE
ivargrimstad
0
230
現場と育てるRailsモデリング 〜Spreadsheetから始めたモデル設計〜
siroemk
2
650
[Rails World 2026] Durable orchestration on Rails: from continuation to workflow
palkan
1
760
JIS keyboard support in Omarchy
lef237
0
140
Herb in Rails 8.2: Your ERB views, now HTML-aware @ Kaigi on Rails 2026, Tokyo, Japan
marcoroth
2
290
Verilogで学ぶCPU自作入門
uyuki234
8
4.1k
なぜCTOを降りてFDEを選んだのか?〜なぜプロダクト企業がFDEで顧客の現場に踏み込むのか〜
gonta
1
220
npm との違いを手がかりにGo の依存管理を理解したい
optim
0
860
Featured
See All Featured
HU Berlin: Industrial-Strength Natural Language Processing with spaCy and Prodigy
inesmontani
PRO
0
760
The Illustrated Children's Guide to Kubernetes
chrisshort
51
53k
Kristin Tynski - Automating Marketing Tasks With AI
techseoconnect
PRO
0
550
Bridging the Design Gap: How Collaborative Modelling removes blockers to flow between stakeholders and teams @FastFlow conf
baasie
0
730
What does AI have to do with Human Rights?
axbom
PRO
1
2.5k
The Mindset for Success: Future Career Progression
greggifford
PRO
0
540
Digital Projects Gone Horribly Wrong (And the UX Pros Who Still Save the Day) - Dean Schuster
uxyall
1
3.4k
Claude Code どこまでも/ Claude Code Everywhere
nwiizo
68
59k
Build The Right Thing And Hit Your Dates
maggiecrowley
39
3.5k
Winning Ecommerce Organic Search in an AI Era - #searchnstuff2025
aleyda
2
2.2k
Become a Pro
speakerdeck
PRO
31
6.3k
Bioeconomy Workshop: Dr. Julius Ecuru, Opportunities for a Bioeconomy in West Africa
akademiya2063
PRO
1
410
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Λॻ͖͑Δ͚ͩͰɺ༷ʑͳ݅ʹ ߹ΘͤͯΧελϚΠζ͢Δ͜ͱ͕ՄೳͰ͢ʂ