Upgrade to Pro — share decks privately, control downloads, hide ads and more …

PHP8になった今の時代に、PHPの「エラー」「例外」そして「Error」をおさらいしておこう...

 PHP8になった今の時代に、PHPの「エラー」「例外」そして「Error」をおさらいしておこう/phperkaigi2021-regular-talk

PHPerKaigi2021でのセッション(20分枠)の資料です。
https://fortee.jp/phperkaigi-2021/proposal/e1e0ebd8-d60c-42ed-b6e6-9a7602258d42

hideki kinjyo

March 27, 2021
Tweet

More Decks by hideki kinjyo

Other Decks in Programming

Transcript

  1. ࣗݾ঺հ • ⾦城秀樹 / きんじょうひでき • GitHub: @o0h / Twitter:

    @o0h_ • 好きなFWはCakePHP • アイコンは 美味しい鮭親⼦丼の写真です
  2. PHPͷʮྫ֎ʯʮΤϥʔʯʹؔͯ͠ɺ Πϯλʔωοτ্ʹ΋ઌୡͷൃ৴ͨ͠༗༻ͳ৘ใ͕ͨ͘͞Μ͋Γ·͢ɻ ಛʹɺ͜ΕΒͷهࣄ͸େมࢀߟʹ͍͖ͤͯͨͩ͞·ͨ͠ɻ(ޚྱਃ্͛͠·͢) ੋඇ͝ҰಡΛ͓͢͢Ί͠·͢ɻ ※ͦΕͧΕͷࢿྉͷ࡞੒ɾߋ৽࣌ظʹ஫ҙ ຊฤʹೖΔલʹ • PHPのエラーと例外再⼊⾨ / php-error-and-exception

    https://speakerdeck.com/hirak/php-error-and-exception • ここで差がつくエラー処理 完全版 #phpcon2017 (via tadsanスライド集 2015〜2019 保存版 - tadsan.txt - BOOTH) https://booth.pm/ja/items/1508788 • PHP でどのように Exception/RuntimeException/LogicException を使い分けるか https://qiita.com/tanakahisateru/items/e3e24f3825c4ba0c60e6 • PHPの例外 https://qiita.com/koriym/items/17cfd1bbbaead1a2e5a9 • お前は PHP 7 におけるFatal Error / Catchable Fatal Error / Error / ErrorException / Exception の違いを⾔えるか? https://qiita.com/mpyw/items/c69da9589e72ceac470c
  3. ৭ʑͳΤϥʔ͕͋Δ • จ๏Τϥʔ • ແݶϧʔϓ • Ϋϥε໊΍ؔ਺໊ͷॏෳ • ϝϞϦᷓΕ •

    ॻ͖ࠐΈݖݶͷෆ଍ • θϩআࢉ • ܕએݴͱͷෆҰக • Interfaceͷະ࣮૷ • ະఆٛͷม਺ͷར༻ • ෆՄೳͳΩϟετ
  4. ܖ໿ͱྫ֎ • ϧʔνϯ(ϝιου΍ؔ਺)͸ɺ • ݺͼग़͠ଆʹʮࣄલ৚݅Λຬͨ͢͜ͱʯΛཁٻ͢Δ • ݺͼग़͠ଆʹʮࣄޙ৚݅Λຬͨ͢͜ͱʯΛอূ͢Δ • ͜ΕΒ͕ຬͨ͞Εͳ͍ঢ়گ͕ྫ֎ •

    ϧʔνϯ͸ॲཧΛதஅ͠ɺݺͼग़͠ݩʹޙॲཧΛҕͶΔ • ݺͼग़͠ݩ͸ʮྫ֎ʯΛड͚औͬͯɺճ෮ΛࢼΈΔ • ճ෮Ͱ͖ͳ͍ͳΒʮࣦഊʯͱͳΔ
  5. ൃੜ͢Δ৔ॴɺൃੜͤ͞Δओମͷҧ͍ • Τϥʔ͸ɺ “PHPΤϯδϯࣗମ͕ΤϥʔΛ௨஌͢Δ࣌ʹ࢖ ͏” (ʰPHPͷΤϥʔͱྫ֎࠶ೖ໳ P51ʱ) • ʹಈ͔ͳͯ͘ɺ͓͔͍͠ •

    ྫ֎͸ɺൃੜͤ͞Δ(=throw͢Δ)ͷ͸͋͘·Ͱʮϓϩάϥ ϜࣗମʯʮϩδοΫʯͱͳΔ • ʹಈ͘͜ͱ͕ग़དྷͯɺ͓͔͍͠
  6. Τϥʔ(க໋తͳΤϥʔ) • ॏେͳΤϥʔͰ͋Γɺॲཧ͕ఀࢭ͞ΕΔ(Fatal Error) • E_ERRORͳͲ • ൃੜͨ͠ྫ֎͕ิ଍͞Εͳ͔ͬͨ৔߹΋Fatal Error •

    register_shutdown_function()Ͱ಺༰ʹΞΫηεͰ͖Δ • ͜͜Ͱؤுͬͯ΋ॲཧΛ෮چͰ͖ΔΘ͚Ͱ͸ͳ͍ 参考: PHP: error_get_last - Manual https://www.php.net/manual/ja/function.error-get-last.php
  7. 参考: PHP: 下位互換性のない変更点 - Manual https://www.php.net/manual/ja/migration80.incompatible.php PHP8ͷΤϥʔ • ʮϝδϟʔόʔδϣϯ্͕Δ͔ΒΤϥʔϨϕϧݟ௚ͦ͏ͥʯ •

    Notice -> Warning • ະఆٛͷม਺΍ϓϩύςΟΛಡΈऔΖ͏ͱͨ͠৔߹ • ΦϒδΣΫτͰͳ͍஋ͷϓϩύςΟΛಡΈऔΖ͏ͱͨ͠৔߹ • ഑ྻͰͳ͍஋ͷΠϯσοΫεʹΞΫηε͠Α͏ͱͨ͠৔߹
  8. ͦͷଞͷErrorͨͪ • PHP8Ͱ\Errorʹͳͬͨ΋ͷˠ • ࢲબͷʮ΁͐ʙʯͱࢥͬͨ΋ͷ • ʮมΘͬͨͶʯͷงғؾΛ ײͯ͡΋Β͑Ε͹ͱʂ 参考: •

    移⾏ガイド: PHP: 下位互換性のない変更点 - Manual https://www.php.net/manual/ja/migration80.incompatible.php • PHP: rfc:engine_warnings https://wiki.php.net/rfc/engine_warnings
  9. \Throwable, \Error͸Ͳ͏͔ʁ • \ThrowableΛัଊ͢Δ = \ExceptionҎ֎΋ัଊ͢Δ = \ErrorΛัଊ͢Δ • \Error͸͋͘·ͰʮPHPΤϯδϯͷΤϥʔʯɻ

    • ͜Ε͕ى͖Δͷ͸ɺʮϓϩάϥϛϯάͷΤϥʔʯͱݴ͑Δ • ϓϩμΫγϣϯʹग़ՙ͞ΕΔ΂͖Ͱͳ͍ɻ ։ൃऀ͸ɺςετ΍ࢼݧ؀ڥͰൃݟͨ͠Βमਖ਼Λ͢΂͖
  10. \Error, \LogicException, \RuntimeException \ThrowableͳΦϒδΣΫτΛɺʮൃੜ͢ΔݪҼʯʹԠͯ͡3ͭʹ෼ྨ͢Δ • \Error: ϓϩάϥϛϯάͷϛε => ੹೚͸։ൃऀʹ͋Δɻຊ൪Ͱڐ༰͠ͳ͍ •

    \LogicException: ϩδοΫͷϛε => ੹೚͸։ൃऀʹ͋Δɻຊ൪Ͱڐ༰͠ͳ͍ • \RuntimeException: ࣮ߦ࣌ͷҟৗ => ୭΋ѱ͘Ͷ͑ɾɾɾ͔΋஌Εͳ͍ɻຊ൪Ͱߟྀ͢Δ
  11. 参考: Throwable Exceptions and Errors in PHP 7 - Aaron

    Piotrowski https://trowski.com/2015/06/24/throwable-exceptions-and-errors-in-php7/ \Error͸ัଊ͢Δ΂͖Ͱͳ͍ • ʮPHPͷ࢓༷ʹଇͬͨίʔυΛॻ͚͍ͯͳ͍ʯ͜ͱʹΑΔ΋ͷ • ͜ΕΛัଊ͢Δͷ͸ʮਖ਼͘͠ͳ͍ίʔυΛग़ՙ͢ΔʯͷΛڐ͢ • ࠷΋ʮ֎ଆʯͷ૚Ͱ͸\ThrowableΛѻ͏͜ͱ΋͋Δ • Middleware, set_error_handlerͱ͍ͬͨ΋ͷ • ʮัଊର৅ͷείʔϓ͕޿͗͢Δʯ৔߹ͰͷϩΪϯά౳ͷ໨త
  12. 参考: PHP7 の assert による簡易テストはいいぞ。 | 株式会社インフィニットループ技術ブログ https://www.infiniteloop.co.jp/blog/2016/12/php-assertion-expectation/ \LogicException͸ัଊ͢Δ΂͖Ͱͳ͍ •

    ʮܖ໿͞Εͨࣄલ(ޙ)৚݅Λຬ͍ͨͯ͠ͳ͍ʯ͜ͱʹΑΔ ΋ͷ • ʮਖ਼͘͠ݺͼग़͞ΕͨΒਖ਼͘͠ಈ͘ʯΑ͏ʹ͢Δͷ͸ ։ൃऀͷ(։ൃ࣌ʹ͓͚Δ)࢓ࣄ • ؔ࿈: assert()
  13. ಠࣗྫ֎Λར༻͢Δ • ࣗ෼ͨͪͷΞϓϦέʔγϣϯ಺Ͱྫ֎ΛମܥԽͯ͠ఆ͍ٛͯ͘͠ • ͋͘·ͰʮϋϯυϦϯά͠΍͘͢͢Δʯͷ͕໨త • ԿͰ΋ಠࣗྫ֎Λ࢖͏΂͖ɺͱ͍͏͜ͱͰ͸ͳ͍ • IMO: ʮัଊ͠ͳ͍͍ͯ͘ʯ΋ͷʹؔͯ͠͸ɺSPLͷྫ֎Λར༻ͯ͠΋෼͔Γ

    ΍ͦ͢͏ • ಛʹ\LogicExceptionܥྻͷྫ֎͕ॆ࣮͍ͯ͠Δҹ৅Λड͚Δ 参考: PHPにおける独⾃例外設計を考える / A way to design user-defined exception with PHP https://speakerdeck.com/hgsgtk/a-way-to-design-user-defined-exception-with-php
  14. ྫ֎຋༁ • “্ҐϨΠϠ͸ԼҐϨϕϧͷྫ֎ΛΩϟονͯ͠ɺ্ҐϨΠϠͷதͰɺ্ҐϨϕϧ ͷந৅֓೦ͷ؍఺͔Βઆ໌Մೳͳྫ֎Λεϩʔ͢΂͖Ͱ͢” (ʰEffective Java ୈ3൛ P302ʱ) • ྫ͑͹ʮ֎෦APIͷΫϥΠΞϯτΫϥε͕GuzzleHttp\ExceptionΛ౤͖͛ͯͨʯ৔

    ߹ʹɺ ʮAPIΛར༻͢ΔαʔϏεΫϥε͕ɺద੾ͳ຋༁Λ͢Δʯ͜ͱͰɺ ʮαʔϏεΫϥεͷར༻ऀ͸࣮૷ৄࡉ(GuzzleHttp)Λ஌Βͳͯ͘͢ΉʯΑ͏ʹͳΔ • ʮ༷ʑͳࣄ৘(ྫ֎ΦϒδΣΫτ)ʹରԠͯ͠ɺݺͼग़͠ݩͷؔ৺ʹԊ͏Α͏ͳղ૾ ౓ʹม׵͢Δʯͱ͍ͬͨ͜ͱ΋Մೳ
  15. ͜ͷηογϣϯͰ఻͔͑ͨͬͨ͜ͱ • PHP7->8ͱɺঃʑʹʮΤϥʔͱ෇͖߹͍΍͍͢ʯݴޠʹͳ͍ͬͯ·͢ʂ • خ͍͠ʙʙʂʂ • \Error΍\ThrowableΛัଊ͢Δͷ͸΍Ί·͠ΐ͏ • ʮରԠ͢΂͖λΠϛϯάʯ͕ExceptionͱҟͳΓ·͢ •

    ʮຊ൪Ͱੜ͡ಘΔ΋ͷʯΛcatch͢ΔɺͦΕҎ֎͸։ൃதʹ௚͢ • ʮݟ௨͠ʯΛҙࣝ͠ͳ͕Βʮྫ֎ʯͱ෇͖߹͍͖͍ͬͯͨͰ͢Ͷʂ • νʔϜͰͷҙࣝ߹Θ͕ͤඞਢͱࢥ͍·͢ʂ
  16. ʮErrorʯʮྫ֎ʯʹؔͯ͠ͷجૅ • ·ͣ͸͜ͷลΓͷ৘ใΛ཈͓͑ͯ͘͜ͱͰɺνʔϜ಺Ͱͷٞ࿦΍ࣗ਎͕։ൃΛ͢ Δࡍͷࢹ఺͕εοΩϦ͢Δͱࢥ͍·͢ɻΦεεϝ(※๯಄Ͱ঺հͨ͠΋ͷͷ࠶ܝ) • PHPのエラーと例外再⼊⾨ / php-error-and-exception https://speakerdeck.com/hirak/php-error-and-exception •

    ここで差がつくエラー処理 完全版 #phpcon2017 (via tadsanスライド集 2015〜2019 保存版 - tadsan.txt - BOOTH) https://booth.pm/ja/items/1508788 • PHP でどのように Exception/RuntimeException/LogicException を使い分けるか https://qiita.com/tanakahisateru/items/e3e24f3825c4ba0c60e6 • PHPの例外 https://qiita.com/koriym/items/17cfd1bbbaead1a2e5a9 • お前は PHP 7 における Fatal Error / Catchable Fatal Error / Error / ErrorException / Exception の違いを⾔えるか? https://qiita.com/mpyw/items/c69da9589e72ceac470c
  17. ΤϥʔϋϯυϦϯάܥ • PHPͰͷΤϥʔ੍ޚɺϨϙʔςΟϯάʹؔͯ͠ͷ۩ମతͳ ৘ใͰ͢ • ֓ཁΛ௫Μͩ͋ͱʹɺ࣮ࡍʹOSSͷFW౳ͰͲ͏ѻΘΕͯ ͍Δ͔Λ೷͍ͯΈΔͷ΋ΦεεϝͰ͢ • PHPの扱いづらいエラーをうまい感じにやるのとPHPerKaigi2019で登壇しますの話 -

    uzullaがブログ https://uzulla.hateblo.jp/entry/2019/03/13/200820 • PHPのエラーハンドリングとロギング - fortkle blog https://fortkle.hatenablog.com/entry/2017/05/25/214544 • <実装例>middlewares/whoops: PSR-15 middleware to use Whoops as error handler https://github.com/middlewares/whoops
  18. ྫ֎ͷઃܭͳͲ • ݎ࿚ੑΛߴΊͨΓɺ։ൃମݧΛ޲্ͤ͞ΔͨΊʹʮͲͷΑ ͏ʹྫ֎Λ࢖͍͜ͳ͔͢ʯͷࢦ਑ͱͳΔهࣄͰ͢ • PHP7 で堅牢なコードを書く - 例外処理、表明プログラミング、契約による設計 /

    PHP Conference 2016 https://speakerdeck.com/twada/php-conference-2016 • PHPにおける独⾃例外設計を考える / A way to design user-defined exception with PHP https://speakerdeck.com/hgsgtk/a-way-to-design-user-defined-exception-with-php • PHP Exception Handling Archives · Airbrake https://airbrake.io/blog/category/php-exception-handling
  19. PHP7ʹ͓͚ΔErrorपΓͷRFC౳ • PHPͷ಺෦࣮૷ɺͦͷRFCɺ࢓૊ΈͳͲ • Error, Throwableͷଘࡏҙٛʹ͍ͭͯ֬ೝͰ͖·͢ • PHP: rfc:engine_exceptions_for_php7 https://wiki.php.net/rfc/engine_exceptions_for_php7

    • PHP: rfc:throwable https://wiki.php.net/rfc/throwable • Throwable Exceptions and Errors in PHP 7 - Aaron Piotrowski https://trowski.com/2015/06/24/throwable-exceptions-and-errors-in-php7/ • PHP7調査(23)致命的エラーが例外としてキャッチできるようになった - Qiita https://qiita.com/hnw/items/4e2d47d269a26025a726
  20. PHP8ͰͷErrorपΓͷRFC౳ • PHP8ͰͷػೳڧԽɾมߋʹؔ͢Δ৘ใͰ͢ • PHP: rfc:engine_warnings https://wiki.php.net/rfc/engine_warnings • PHP: rfc:consistent_type_errors

    https://wiki.php.net/rfc/consistent_type_errors • New `ValueError` Error Exception - PHP 8.0 https://php.watch/versions/8.0/ValueError • Internal function warnings now throw `TypeError` and `ValueError` exceptions - PHP 8.0 https://php.watch/versions/8.0/internal-function-exceptions • PHP8.0がリリースされたので新機能全部やる https://zenn.dev/rana_kualu/articles/2b0a9f1aba60dc
  21. Ҿ༻ͨ͠ॻ੶ɾؔ࿈ॻ੶ • ຊηογϣϯʹͯҾ༻ͨ͠ॻ੶΍ɺ Τϥʔ΍ྫ֎ͱʮ޲͖߹͏ʯʮཧղΛਂΊΔʯͷʹ໾ཱͭॻ ੶Ͱ͢ • オブジェクト指向⼊⾨ 第2版 原則・コンセプト (IT

    Architect’Archive クラシックモダン・コン ピューティング) | バートランド・メイヤー, 酒匂 寛 https://www.amazon.co.jp/dp/4798111112 • Effective Java 第3版 | Joshua Bloch, 柴⽥ 芳樹 https://www.amazon.co.jp/dp/4621303252 • 達⼈プログラマー(第2版): 熟達に向けたあなたの旅 | Thomas, David, Hunt, Andrew, 雅章, 村上 https://www.amazon.co.jp/dp/4274226298