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
PHPのエラーと例外再入門 / php-error-and-exception
Search
Hiraku NAKANO
June 10, 2017
Technology
20k
19
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
PHPのエラーと例外再入門 / php-error-and-exception
PHPカンファレンス福岡2017の登壇資料です。
Hiraku NAKANO
June 10, 2017
Transcript
123 slides
PHPͷ Τϥʔͱྫ֎࠶ೖ PHPΧϯϑΝϨϯεԬ 2017
ࣗݾհ • த (@Hiraku) • https://github.com/hirak • ීஈϝϧΧϦͰαʔόʔαΠυΤϯδχΞ ͬͯ·͢
• Composerؔ࿈ͷൃදΛΑ͍ͯ͘͠·͢
None
None
None
None
PHPͷ Τϥʔͱྫ֎࠶ೖ PHPΧϯϑΝϨϯεԬ 2017
ͳΜͰࠓ͞Β ʮΤϥʔͱྫ֎ʯʁ
None
ྫ֎͕Β͍͠ʂ • 2016ʙ ҰॠQiitaϒϩάͰྫ֎ͷهࣄ ͕૿͑ͨ • http://php-genba.shin1x1.com/1 • ͨͿΜݯPHPΧϯϑΝϨϯε2016Ͱͷ @t_wada
͞Μͷߨԋ
None
͔Ϳͬͨ… ʘ(^o^)ʗ
ྫ֎+PHPͷࣄ ͕ ηογϣϯͰ͢
࣍ 1. ʮΤϥʔʯͷఆٛ 2. ൃੜͱޙ࢝ͷ 3. PHPͷΤϥʔͱྫ֎ͷػೳ 4. ྫ֎҆શͱΦϒδΣΫτࢦ 5.
ϙέϞϯ
1ষ ʮΤϥʔʯͷఆٛ
ྫ: HTTPͰϑΝΠϧऔಘ͢Δؔ • $resp = http_get('http://php.net/') • ࣗલ࣮͢ΔͳΒɺͲΜͳΤϥʔॲཧΛॻ͖ ·͔͢ʁ
http_get(true); // boolean͕͞ΕͨΜͰ͚͢Ͳʂ http_get('uso800'); // URL͡Όͳ͍ʂ http_get('http://uso800.example.com/'); // !υϝΠϯݟ͔ͭΒͳ͍Α http_get('http://heavy.example.com/');
// !3࣌ؒͨͬͯऴΘΒͳ͍ΜͰ͕͢
Τϥʔͱ • Կ͔ྑ͘ͳ͍͜ͱ͕ى͖ͨ • ॲཧΛਐΊΒΕͳ͍ • ʮॲཧΛதࢭ͢Δʯ • ʮԡ͠௨͢ʯ
http_get(true); // boolean͕͞ΕͨΜͰ͚͢Ͳʂ http_get('uso800'); // URL͡Όͳ͍ʂ http_get('http://uso800.example.com/'); // !υϝΠϯݟ͔ͭΒͳ͍Α http_get('http://heavy.example.com/');
// !3࣌ؒͨͬͯऴΘΒͳ͍ΜͰ͕͢ ←ॻ͍͕ͨͭѱ͍ ʢόάʣ ←Β͍ࣄނ
୭͕ѱ͍͔ • ͍ํ͕ؒҧ͍ͬͯΔύλʔϯ • Ͳ͏ͯ͠ൃੜ͠͏Δύλʔϯ (࣮ߦ࣌Τϥʔ) • typoͳͷ͔ʁ ࣮ߦ࣌Τϥʔͳͷ͔ʁ •
͔ؔΒผͰ͖ͳ͍ύλʔϯ
None
PHPͷཱͰʮΤϥʔʯͱ • PHPࣗମ • ʮιʔείʔυΛड͚औͬͯʯ • ʮ࣮ߦ͢Δʯ • ؔΈ͍ͨͳͷ •
PHPʹͱͬͯԿ͔ྑ͘ͳ͍͜ͱ͕ى͖ͨ ʹΤϥʔ
PHPʹͱͬͯྑ͘ͳ͍͜ͱ • มͳιʔείʔυ͕͞Εͨ • ࣮ߦͯ͠ΈͨΒมͳ͜ͱ͕ى͖ͨ
php > "Hello world"Λग़ྗͯ͠Լ͍͞ɻ; PHP Parse error: syntax error, unexpected
identifier (T_STRING) in php shell code on line 1 ԿޠͩΑͦΕʂ ཧղෆೳɺॲཧࢭΊΔͶ
php > echo Hello; PHP Notice: Use of undefined constant
Hello - assumed 'Hello' in php shell code on line 1 Hello ະఆٛఆ… ͨͿΜ""ΛΕͯΔΜͩͳʂ উखʹจࣈྻѻ͍ʹͯ͠Ζ͏ ͨͩͪ͠ΐͬͱո͍͔͠Β Τϥʔͱͯ͠௨
php > echo [1,2,3]; PHP Notice: Array to string conversion
in php shell code on line 1 Array ྻΛecho… ༷ͱͯ͠"Array"ͱग़ྗ ͢Ε͍͍Μ͚ͩͲɺո͍͔͠Β Τϥʔͱͯ͠௨
PHP͞ΜେมͳͷͰ͢ • ίϯύΠϧɺͱ͍͏લॲཧ͕ͳ͍ • ͯ͢Λ࣮ߦ࣌ʹॲཧ͠ɺո͚͠Εͱʹ͔ ͘ΤϥʔΛు͘ • ଞͷݴޠͩͱlintίϯύΠϧ࣌warningʹ૬ ͢Δ෦ʮΤϥʔʯͷൣᙝʹͳΔ
PHPͷΤϥʔ৭ʑ • ߏจ͓͔͍͠ (parse error) • ܕએݴҧ • ͪΐͬͱ͋Γ͑ͳ͍҉ͷܕม •
ഇࢭ༧ఆͷؔΛ࣮ߦͨ͠ (deprecated) • ഇࢭ༧ఆͷߏจΛ͍ͬͯΔ (strict)
1ষ ·ͱΊ • PHPιʔείʔυΛͦͷͰ࣮ߦͰ͖ͳ͚ Ε͍͚ͳ͍ͷͰɺʮΤϥʔʯͷൣғ͕͍ • lintʹ͍ۙ༰ʮΤϥʔʯʹͳΔ
2ষ ൃੜͱޙ࢝ͷ
࠶ܝ: HTTPͰϑΝΠϧऔಘ͢Δؔ • $resp = http_get('http://php.net/') • ࣗલ࣮͢ΔͳΒɺͲΜͳΤϥʔॲཧΛॻ͖ ·͔͢ʁ
͠ɺhttp_getؔͷ༷͕ • ʮऔಘͰ͖ͳ͔ͬͨΒϦτϥΠ͠ଓ͚Δʯ ͩͬͨΒʁ • URLΛtypoͨ͠Β
͠ɺhttp_getؔͷ༷͕ • ʮऔಘͰ͖ͳ͔ͬͨΒۭจࣈΛฦ͢ʯ ͩͬͨΒʁ • ຊʹϨεϙϯε͕ۭจࣈͩͬͨͱ͖ͱݟ ͚͕͔ͭͳ͍
͠ɺhttp_getؔͷ༷͕ • ʮऔಘͰ͖ͳ͔ͬͨΒϩάʹهͯ͠falseΛ ฦ͢ʯͩͬͨΒʁ • ϩάͷॻ͖ࠐΈઌͬͯͲ͜Ͱઃఆ͢Δͷʁ
ͳʹ͔ؒҧ͍͑ͯΔͷͰ…
Τϥʔͷޙ࢝ͷಛ • ঢ়گʹΑͬͯมΘΓ͕ͪ • ϦτϥΠ • ϩάʹు͍ͯఘΊΔ (ϑΝΠϧ/ඪ४ग़ྗ) • ผͷؔʹϑΥʔϧόοΫ͢Δ
• etc
Τϥʔൃੜͷύλʔϯ • ҧ͏ؔͰಉ͡Τϥʔ͕ى͖Δ͜ͱසग़ • ྫ) http_get()ͱhttp_post()ϗετ໊͕ղܾ Ͱ͖ͳ͚Εಉ͡Τϥʔ • ͍͍ͪͪॲཧΛॻ͍ͯͨΒίϐϖͩΒ͚ʹͳ Δ
ൃੜͱޙ࢝Λ ͠·͠ΐ͏
͠ɺhttp_getؔͷ༷͕ • ʮऔಘͰ͖ͳ͔ͬͨΒΤϥʔΛ௨͢Δʯ(͋ ͑ͯԿॲཧ͠ͳ͍)ͩͬͨΒʁ • ঢ়گʹԠͯ͡ΤϥʔॲཧΛมߋͰ͖Δ✅ • ΤϥʔॲཧΛڞ௨ԽͰ͖Δ✅
ΤϥʔΛ௨͢ΔͨΊʹ • શͯͷॲཧதࢭ • ޙ࢝Ͱඞཁͳใͷίϐʔ͕ඞཁ • ʮԿ͕ى͖ͨͷ͔ʯ • ʮͲͷॲཧΛ͍ͯͨ͠࠷தͳͷ͔ʯ
Τϥʔͷ௨ํ๏͍Ζ͍Ζ • Τϥʔίʔυ(int)Λฦ͢ (Cݴޠͱ͔) • ίʔϧόοΫΛذ͢Δ(Promise) • ΤϥʔΛλϓϧͰฦ͢ (Goͱ͔) •
ྫ֎Λ͛Δ
ྫ֎Ҏ֎ͷྲྀͷ ͠·ͤΜ
ྫ֎ΛUISPX͢Δؔ ྫ֎ΛUISPX͢Δؔ ྫ֎ΛUISPX͢Δؔ ຊ൪ڥͰ DBUDI͢Δؔ ։ൃڥͰ DBUDI͢Δؔ Τϥʔ͕ى͖ͨΒ ྫ֎Λ͛Δ͚ͩ େଟͬͪ͜
ྫ֎Λੳͯ͠ దͳޙ࢝Λ͢Δ
͋ΔؔͷҰੜ ॲཧ։࢝ ਖ਼ৗऴྃ ؔݺͼग़͠ ؔݺͼग़͠
ྫ֎͕throw͞ΕͨΒ ॲཧ։࢝ try catch UISPXOFX 999&YDFQUJPO (͜ͷลͷॲཧ࣮ߦ͞Εͳ͍ catchʹॻ͍ͯ͋Δॲཧ
ྫ֎͕ͬͯ͘ΕΔ͜ͱ • ✅શͯͷॲཧதࢭ • ✅ޙ࢝ͰඞཁͳใΛ$eʹؚΊΒΕΔ • ✅͋ͱͰ·ͱΊͯtry ~ catch Ͱ͖Δ
2ষͷ·ͱΊ • ΤϥʔॲཧΛ៉ྷʹ͢Δʹɺൃੜͱޙ࢝ Λ͚ͯॻ͘ͱΑ͍ • ྫ֎͜ͷͨΊͷػೳ
3ষ PHPͷΤϥʔͱྫ֎
ͷ Τϥʔؔ ྺ࢙తܦҢͰෳࡶ
ʮΤϥʔʯ ͱ ʮྫ֎ʯ
PHPͷʮΤϥʔʯ • PHPΤϯδϯࣗମ͕ΤϥʔΛ௨͢Δͱ͖ʹ ͏ • ใจࣈྻͷΈ • ໌ࣔతʹൃੜͤ͞Δ͜ͱͰ͖Δ • trigger_error("ഇࢭ༧ఆ",
E_USER_DEPRECATED)
ΤϥʔϨϕϧʹΑͬͯಈ͖͕ҧ ͏ • E_ERROR ... ॲཧ͕தஅ͞ΕΔɻ΄΅෮ؼͰ͖ͳ͍ • E_WARNING, E_NOTICE ͦͷଞଟ
... ॲཧதஅ͞Εͳ͍
PHPͷʮྫ֎ʯ • PHP5͔Βಋೖ͞Εͨʮྫ֎ॲཧػߏʯ • ॊೈʹΩϟονͰ͖ͯແࢹͰ͖ͳ͍ • ྫ֎Ϋϥεࣗ༝ʹ֦ுͰ͖Δ • ͖ͳใΛ٧ΊͯOK
Τϥʔ ྫ֎ ੲ͔Β͋Δ 1)1Ҏ߱ ΤϥʔϝοηʔδͷΈؚΊΒΕΔ ԿͰؚΊΒΕΔɺ ΦϒδΣΫτ͝ͱ͛ΒΕΔ ΈࠐΈͷΤϥʔϨϕϧ͔Β બͿ͔͠ͳ͍ ͍͘ΒͰܕΛ૿ͤΔ
֦ுͰ͖Δ ઃఆ!ԋࢉࢠͰ ؆୯ʹແࢹͰ͖Δ ແࢹͰ͖ͳ͍ ѲΓͭͿ͢ίʔυॻ͚Δ
Ͳ͏ݟͯ ྫ֎ͷํ͕ߴػೳ
ΤϥʔΛྫ֎ʹม͢Δຐ๏ →Τϥʔෆཁͳͷʁ
ͦΜͳ͜ͱͳ͍Α ΤϥʔศརͳࢠͩΑ
Τϥʔͷॴ=ແࢹͰ͖Δ͜ͱ • ઃఆͰҰׅແࢹ or @ԋࢉࢠͰݸผʹແࢹ • ʮॲཧΛࢭΊΔඞཁͳ͍͕ɺϓϩάϥϚʹ Ұݴڭ͍͑ͨʯͱ͖ͬͪ͜ͷํ͕ศར • E_DEPRECATED͕දతͳྫ
ϥΠϒϥϦͷAPIΛมߋ͍ͨ͠ ͱ͖ function doSomething() { trigger_error( 'doSomethingͷΘΓʹdoSomething2ΛͬͯԼ͍͞', E_USER_DEPRECATED ); return
doSomething2(); }
deprecatedΛྫ֎ʹ͢Δͱ • ྫ֎ແࢹͰ͖ͳ͍ͷͰ… • ݹ͍ؔΛ͍ͬͯΔશ͕ͯյΕΔ • શ෦मਖ਼͠ͳ͍ͱҠߦͰ͖ͳ͍ • मਖ਼ͯ͠Δؒɺ৽ػೳ͕͑ͳ͍ʂ
deprecated͕ΤϥʔͳΒ • Ұ୴E_DEPRECATED, E_USER_DEPRECATED Λແࢹ͢Δઃఆʹͯ͠Ξοϓσʔτ • ։ൃڥͰ༗ޮʹͯ͠ɺൃੜΛ௵͍ͯ͘͠ • ͍ͩͿݮΒͤͨΒɺຊ൪Ͱ༗ޮʹͯ͠ɺൃ ੜͷ໓Λ֬ೝ͢Δ
ଞͷखஈ • /** @deprecated */ • ௨ৗར༻ऀ͕ಡΜͰ͘Εͳ͍ͱҙຯͳ͍ • error_log •
ϩά͋͘·ͰจࣈྻͰ͔͠ͳ͍
ݸਓతͳ͍͚ • ࣗͷίʔυͰྫ֎Λ͏ • େͷPHPΤϥʔɺErrorExceptionʹม͢Δ • ͨͿΜόάͳͷͰಠࣗʹcatch͠ͳ͍ • ͨͩ͠ɺE_DEPRECATEDܥͳͲྫ֎ʹ͠ͳ͍ ํ͕ศར
set_error_handlerୈೋҾ set_error_handler( function(...){ throw new ErrorException(...); }, E_ALL ^ E_DEPRECATED
^ E_USER_DEPRECATED ^ E_USER_NOTICE ); ϋϯυϦϯάͨ͘͠ͳ͍ ΤϥʔϨϕϧΛ আ֎͓ͯ͘͠
ΤϥʔϨϕϧ͍͚ • E_ERROR ... PHP7Ͱྫ֎ʹͳͬͨ • E_WARNING, E_NOTICE ... େɺΫιίʔυ͕Ҿ͖ى͜͠
͍ͯΔͷͰྫ֎ԽɻଈࠁࢭΊͯσόοά • E_STRICT, E_DEPRECATED ... ແࢹͯ͠ಈ͘ͷͰྫ֎Խ͠ ͳ͍ɻඞཁʹԠͯ͡ࢹɺσόοά • E_USER_XXXX .. ͋͑ͯΤϥʔΛ͍ͬͯΔྫͳͷͰɺྫ֎ ʹ͠ͳ͍͍͔ͯ͘ɻ
3ষ·ͱΊ • PHPʹʮΤϥʔʯͱʮྫ֎ʯ͕͋Δ • Τϥʔ؆୯ͳ௨ͱͯ͠ศར • ྫ֎ແࢹͰ͖ͳ͍ • جຊతʹྫ֎Λ͓͏
4ষ ྫ֎҆શͱΦϒδΣΫτࢦ
ྫ֎ͷϓϥε໘ • ίʔυதʹΤϥʔॲཧ͕ొ͠ͳ͍ͷͰɺ ៉ྷʹͳΔ • ʮίʔυఀࢭʯΛࣗಈͰͬͯ͘ΕΔ • ແࢹ͢ΔͱΫϥογϡ͢ΔͷͰແࢹͰ͖ͳ͍ɻ ΤϥʔॲཧΛ͖ͬͪΓߦ͏ίʔυΛཁٻ͢Δɻ
ྫ֎ͷͳ͍ੈք $ret = doSomething(); if ($ret === false) { //
Τϥʔॲཧ͍ͬͺ͍ return false; } $ret2 = doSomething2(); if ($ret2 === false) { // Τϥʔॲཧ͍ͬͺ͍ return false; }
ྫ֎ͷ͋Δੈք $ret = doSomething(); $ret2 = doSomething2(); // ... Ͳ͔͜ݺͼग़͠ͷ
্ྲྀͷํͰҰ͚ͩ try { } catch { } ͯ͋͠ΕOK
࠶ܝɿ ྫ֎͕throw͞ΕͨΒ ॲཧ։࢝ try catch (͜ͷลͷॲཧ࣮ߦ͞Εͳ͍ catchʹॻ͍ͯ͋Δॲཧ UISPXOFX 999&YDFQUJPO
͓ؾ͖ͮͩΖ͏͔…
ྫ֎͕throw͞ΕͨΒ ॲཧ։࢝ try UISPXOFX 999&YDFQUJPO catch (͜ͷลͷॲཧ࣮ߦ͞Εͳ͍ த్ͳͱ͜ΖͰࢭ·͚ͬͨͲɺ ຊʹେৎͳͷ͔ʁ catchʹॻ͍ͯ͋Δॲཧ
ྫ֎ͷϚΠφε໘ • ͍ͭͲ͜Ͱॲཧ͕தஅ͞ΕΔ͔Θ͔Βͳ͍ • Ͳ͜Ͱதஅ͞ΕͯΞϓϦέʔγϣϯ͕յΕͳ ͍Α͏ʹؾΛ͚ͭΔඞཁ͕͋Δ • յΕͳ͍ੑ࣭Λʮྫ֎҆શʯͱݴ͏ • ྫ֎Λѻ͏ਓɺ
ৗʹҙࣝ͠ͳ͚ΕͳΒͳ͍
None
ʮྫ֎҆શʯΛάάΔͱ • C++ͷ͕ଟ͍ • ྫ֎҆શҧ=ଈࢮͷੈք • ͨͩɺݴޠؔͳ͘ॏཁͰ͢ʂ • ྫΛڍ͛·͢
ྫ1
ِͷτϥϯβΫγϣϯ $db->insert($a); doSomething(); $db->insert($b); ... ͜͜Ͱྫ֎͕ى͖ͨΒ த్ͳϨίʔυ͕Ͱ͖ͪΌ͏
DBૢ࡞தͷྫ֎ • DBૢ࡞ͷ݁Ռ͕ͬͯ͠·͏ • ෆ۩߹ͷݪҼʹͳΔ • ૢ࡞͕ਖ਼ৗʹऴΘ͔ͬͨɺԿͳ͔͔ͬͨɺ ͲͪΒ͔ʹ͢Δ = DBͷτϥϯβΫγϣϯػೳ
Λ͏
[ྫ֎҆શ]τϥϯβΫγϣϯ $db->beginTransaction(); try { $db->insert($a); doSomething(); $db->insert($b); $db->commit(); } catch
(\Exception $e) { $db->rollback(); throw $e; }
ྫ2
κϯϏΩϟογϡ if (self::$cache) return self::$cache; $result = doSomething1(); self::$cache =
$result; doSomething2($result); ͜͜Ͱྫ֎͕ى͖ͨΒʁ Ωϟογϡͬͯ͠·͏͚Ͳʁ
ण໋ͷ͍มͷѻ͍ʹҙ • Ϋϥεͷstaticมɺάϩʔόϧม • ྫ֎Ͱதஅ͞Εͯੜ͖ͬͨ·· • ྫ֎ൃੜΛτϥοϓͯ͠আ͢Δඞཁ͕͋Δ ͔
ྫ3
Cݴޠ෩ͷؔ ob_start(); doSomething(); $output = ob_get_clean(); ͜͜Ͱྫ֎͕ى͖ͨΒʁ PC@HFU@DMFBO ݺΕͳ͘Ͷʁ
ͦͦΈࠐΈͷ͕ؔ ྫ֎҆શ͡Όͳ͍ • ob_start / ob_clean • fopen / fclose
• ͕ؔରʹͳ͍ͬͯΔྫ͕݁ߏ͋Δ
PHPࣗମ͕कͬͯ͘ΕΔ҆શੑ • ؔϩʔΧϧͳมGC͕ճऩͯ͘͠ΕΔ • fopenͳͲͷϦιʔεܕࣗಈͰด͡ΒΕΔ • ͔͠͠ʮstaticมʯʮ֎෦γεςϜʯʮDBʯ ͳͲ͜ͷൣғʹؚ·Εͳ͍ • ѻ͏ਓ͕ྫ֎҆શΛҙࣝ͢Δ͔͠ͳ͍
ྫ֎҆શͷ͠͞ • ྫ֎҆શ͔Ͳ͏͔ػցతʹஅͮ͠Β͍ • ίʔυʹؔΘΔਓશһ͕कΔඞཁ͕͋Δ • ͜Ε͕͗͢͠Δ
ྫ֎҆શΛ࣮ݱ͢Δ ΠσΟΦϜू
RAII (scope & destructor) class Curl { function __construct() {
$this->ch = curl_init(); } function __destruct() { curl_close($this->ch); } }
RAII (scope & destructor) function req() { $ch = new
Curl(); //... //... } Ҏ߱ɺͲ͜Ͱॲཧ͕ தஅͯ͠σετϥΫλ͕ ޙ࢝ͯ͘͠ΕΔͷͰฏؾ
RAIIͷϋϚΓͲ͜Ζ • େ͏·͍͘͘ͷ͕ͩɺExceptionͷελο ΫτϨʔεͳͲʹั·Δͱɺण໋͕৳ͼΔ • ࢥͬͨλΠϛϯάͰclose͞Εͳ͘ͳΔ͔
ൣғͰcatchͯ͠re-throw try { ... } catch (Exception $e) { ...
//ޙ࢝Λॻ͘ throw $e; }
࠷ॳ͔ΒfinallyͰॻ͘ try { $ch = curl_init(); //... } finally {
curl_close($ch); }
ྫ֎ͱਖ਼͖͘͠߹͏ ͷ͍͠
͔͠͠ ʮྫ֎ࣗମΛΘͳ͍ʯ ͷ͍͠
4ষ ྫ֎҆શͱΦϒδΣΫτࢦ
ྫ֎ͱΦϒδΣΫτࢦ • ຊདྷɺྫ֎ΦϒδΣΫτࢦͱશؔ͘ͷͳ ͍֓೦ • PHPExceptionΫϥεΛܧঝͨ͠ΦϒδΣΫτ ͔͠throwͰ͖ͳ͍͚Ͳ • 400 ͱ͔
"Τϥʔ͕ى͖·ͨ͠" ͱ͔Λthrow Ͱ͖Δݴޠ͋Δ
ΦϒδΣΫτࢦͯ͠Δͱ • ίϯετϥΫλΛଟ༻ͨ͘͠ͳΔͣ • த్ͳঢ়ଶ͕ͳ͍͜ͱ͕อূͰ͖Δ • ίϯετϥΫλͦͷ্༷ɺ Τϥʔ௨ʹྫ֎͔͑͠ͳ͍ • return
false ͕Ͱ͖ͳ͍͔ΒͶ
ྫ) PDO • σϑΥϧτͩͱྫ֎Λు͔ͳ͍ઃఆ • $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); • ͔͠͠ɺnew PDO͢Δͱ͖ͷΤϥʔɺઃఆ
ʹؔͳ͘ৗʹ1%0&YDFQUJPO
࣮ࡍʹ࣮ߦͨ͠ྫ php > $pdo = new PDO('uso800'); PHP Warning: Uncaught
PDOException: invalid data source name in php shell code:1 Stack trace: #0 php shell code(1): PDO->__construct('uso800') #1 {main} thrown in php shell code on line 1
ͦͷଞͷࣄ • PHP7ͰE_ERROR͕ྫ֎ͷΑ͏ͳ;Δ·͍Λ ͢ΔΑ͏ʹͳͬͨ • ݴޠΈࠐΈػೳঃʑʹΤϥʔ͔Βྫ֎ʹ ஔ͖͍͑ͯͧ͘એݴ͕ग़͍ͯΔ • ͏ɺྫ֎ͷൃੜ͠ͳ͍ੈքͳͲPHPʹ ͳ͍
զʑྫ֎ͱ ڞʹੜ͖Δ͔͠ͳ͍ͷͰ͢
4ষ·ͱΊ • PHPerྫ֎҆શΛҙࣝ͠·͠ΐ͏ • ΫϥεΛ͑ྫ֎Λ͏Ҏ֎બࢶ͕ͳ͍ ͷͰɺݡ͖͘߹͍͖ͬͯ·͠ΐ͏
5ষ ϙέϞϯ
try { doSomething(); ... } catch (Exception $e) { //
do nothing }
Pokémon catching • ͨΒ͍ྫ֎ΫϥεͰcatch͍ͯ͠Δ͜ͱͷ ଏশ • RuntimeException/Exception/Throwable • (ϙέϞϯͷΩϟονϑϨʔζʮCatch 'em
allʯ͔Β࿈ͨ͠ͱࢥΘΕΔʣ
Pokémon catchingΛ ͍͚ͬͯͳ͍
try { doSomething(); ... } catch (Exception $e) { //
do nothing }
ԿΛั·͍͑ͨͷ…ʁ • ྫ֎͍ΖΜͳؔͰൃੜ͢ΔՄೳੑ͕͋Δ • PHPࣗͷΤϥʔ͔͠Εͳ͍ • ͋ͳͨຊʹશͯΛదʹޙॲཧͯ͠Δʁ • ͦ͏Ͱͳ͚Εɺࣗͷҙਤͨ͠ྫ֎ͷΈʹ ߜ͓ͬͯ͘
set_error_handlerͱͷ Έ߹Θͤ • PHPΤϥʔΛErrorExceptionʹม͢Δ͜ͱ ͕Ͱ͖Δ • Pokémon catching͕Έ߹Θ͞Δͱࠈ
None
ྫ֎ॲཧʹר͖ࠐ·Εͯtypo ͷҐஔ͕Θ͔Βͳ͍…ʂ
ɾPokémon catching • ྫ֎ࣗͷͨΊʹ༻ҙ͢Δ & ͦΕͷΈΛ catch͢Δ • class HogeException
extends \RuntimeException • setterΛ૿͠·͠ΐ͏
Guzzleͷྫ
ޙ࢝͢ΔਓͷͨΊʹ • ඞཁͦ͏ͳΛExceptionΫϥεʹ٧ΊΒΕΔ Α͏ʹ͢Δ • throw (new HogeException($message, $code)) ->setFoo($foo)
->setMoo($moo);
ͱ͍͑ɺຊ൪Ͱcatch͞Εͳ ͍ྫ֎͕ى͖ͨΒϠόΠ…ʂ
None
อݥͷset_exception_handler • catch͞Εͳ͔ͬͨྫ֎Λั·͑Δ࠷ޙͷࡆ • େͨ͜͠ͱग़དྷͳ͍ͷͰɺϩΪϯάͯ͠Ϣʔ βʔʹΤϥʔը໘ΛݟͤΔ͚ͩɺͱ͔ • ຊ൪ͷΈಈ͔͢ɺͳΜͯ͜ͱՄೳ
͜Ε͑͋͞Εྫ֎ಥ͖ൈ͚ ͳ͍ set_exception_handler( function (Throwable $e) { echo 'Τϥʔ͕ى͖·ͨ͠'; exit;
} );
શମͷ·ͱΊ
Τϥʔͱྫ֎ͷ࠶ೖ • PHPͷΤϥʔແࢹͰ͖Δ͜ͱʹՁ͕͋Γ· ͢ɻdeprecatedͱͯ͠ͷ͍ํΦεεϝ • ྫ֎ศརͰ͕͢ɺྫ֎҆શΛҙࣝ͠ͳ͚Ε͍ ͚ͳ͍͜ͱPHPͰมΘΓ·ͤΜ • ExceptionThrowableΛอݥతҎ֎Ͱcatch͠ ͳ͍Α͏ʹ͠·͠ΐ͏
We are hiring!
More Decks by Hiraku NAKANO
See All by Hiraku NAKANO
iD決済を支える技術 / #merpay_techtalk
hirak
33
7.3k
github.com/mercari の今と昔 /github-mercari
hirak
8
3.2k
PHPStanで始める継続的静的解析 #phperkaigi /php-static-analysis
hirak
14
55k
極める!メソッドチェーン #phpstudy / fluent-interface
hirak
8
3.1k
evalこそパワー #phpkansai / phpkansai2017
hirak
2
1.8k
メルカリ JP Tech Side / mercari-jp-tech-side
hirak
7
2.1k
グローバル展開を支える量子的なサービス設計 #mercariday / mercariday2017-api
hirak
22
14k
Composerプラグインを作ってみよう /phpcon2016
hirak
5
14k
packagist.jpの紹介と新機能 /#phpblt
hirak
4
3k
Other Decks in Technology
See All in Technology
81天的 AI Agent 軟體開發團隊治理實務分享
regionbbs
0
160
Frontier Teams — Amazon は AI で「開発のやり方」をどう変えたのか
kmotohas
0
220
小さなエージェントから始めてみよう!実践コンテキストエンジニアリング
iwamot
PRO
0
120
Steering と Hook (チームの決まりを守らせる) | 目指せ Kiro マスター 06
inariku
PRO
2
120
自治体AIコンタクトセンター、何をどこに任せる?~Amazon Connect Customer +Amazon Bedrockの実践知~ / 20261107 Satoshi Torano
shift_evolve
PRO
1
130
Context != Context: One window, many lifecycles (AI Native DevCon, Nov 2026)
birgitta410
0
120
Kiro を使うコツ (頼み方、覚えさせ方、任せ方) | 目指せ Kiro マスター 09
inariku
PRO
3
150
Bots in Kiro Crew (One point of contact for ongoing work) | Kiro: Zero to Hero 12
inariku
PRO
1
130
Ebitengine製iOSアプリ公開ボタンを押す会
eiei114
0
120
SSFの現在地 ― CAEP/RISCからAI Identityへ
oidfj
0
430
Linuxネットワークスタック進化の軌跡: 過去10年の歩みと最新トレンド
orimanabu
2
570
Kiro アップデート 2026 年 11 月号 (11 月 8 日時点) | 目指せ Kiro マスター アップデート編
inariku
PRO
2
110
Featured
See All Featured
The innovator’s Mindset - Leading Through an Era of Exponential Change - McGill University 2025
jdejongh
PRO
1
400
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
16
2.2k
How To Stay Up To Date on Web Technology
chriscoyier
790
250k
Ten Tips & Tricks for a 🌱 transition
stuffmc
1
280
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
38
3.1k
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
49
3.6k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
17k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
25
2.2k
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
12
1.4k
How to build an LLM SEO readiness audit: a practical framework
nmsamuel
2
980
Marketing Yourself as an Engineer | Alaka | Gurzu
gurzu
0
370
The Cult of Friendly URLs
andyhume
79
7.1k