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

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

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

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

C90bac78c0fb61105cfd8239767f903d?s=128

hideki kinjyo
PRO

March 27, 2021
Tweet

Transcript

  1. PHP8になった今の時代に 「エラー」「例外」そして「Error」を おさらいしておこう PHPerKaigi 2021 Hideki Kinjyo GitHub: o0h /

    Twitter: @o0h_ [഑෍൛]
  2. ࣗݾ঺հ • ⾦城秀樹 / きんじょうひでき • GitHub: @o0h / Twitter:

    @o0h_ • 好きなFWはCakePHP • アイコンは 美味しい鮭親⼦丼の写真です
  3. ちゃんとしたプログラムが書きたい・・ 書きたくない・・・?

  4. ちゃんとしたプログラム 可読性 堅牢性 パフォーマンス 拡張性 アーキテクチャ コンパクトなコード テスタビリティ モジュール性 DRY

    信頼性 セキュア パフォーマンス hogeプリンシパル piyoパターン
  5. 「意図がわかる」 「失敗を防げる」 「復旧しやすい」 というのは1つの価値になる(ハズ)

  6. “エラー”と向き合う!!

  7. ͓͠ͳ͕͖ 1. Τϥʔɺྫ֎ͬͯͳΜͩʂʁ 2. Τϥʔɺྫ֎ͷϋϯυϦϯά 3. PHP7ʙPHP8ͱΤϥʔ 4. Τϥʔɺྫ֎ͱͲ͏෇͖߹͏͔ 5.

    ʮྫ֎ʯΛ׆༻ͯ͠ݟ௨͠Λྑ͘
  8. 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
  9. §1: エラー、例外ってなんだ!?

  10. Τϥʔʁ • (php.netᐌ͘)ίʔσΟϯά΍࣮ߦ࣌ʹൃੜ͢Δ໰୊ PHP: エラー - Manual https://www.php.net/manual/ja/language.errors.php

  11. Τϥʔɾɾɾʁ • (php.netᐌ͘)ίʔσΟϯά΍࣮ߦ࣌ʹൃੜ͢Δ໰୊ • ͬ͘͟Γݴ͑͹ ʮਖ਼ৗͳॲཧ͕Ͱ͖ͳ͍ɾ೉ͦ͠͏ʯͳঢ়گ

  12. ৭ʑͳΤϥʔ͕͋Δ • จ๏Τϥʔ • ແݶϧʔϓ • Ϋϥε໊΍ؔ਺໊ͷॏෳ • ϝϞϦᷓΕ •

    ॻ͖ࠐΈݖݶͷෆ଍ • θϩআࢉ • ܕએݴͱͷෆҰக • Interfaceͷະ࣮૷ • ະఆٛͷม਺ͷར༻ • ෆՄೳͳΩϟετ
  13. ྫ֎ʁ • (php.netᐌ͘)ଞͷϓϩάϥϛϯάݴޠʹࣅͨྫ֎Ϟσϧ PHP: 例外(exceptions) - Manual https://www.php.net/manual/ja/language.exceptions.php

  14. ྫ֎ɾɾɾʁ • “ྫ֎ͱ͸ϧʔνϯίʔϧͷࣦഊΛҾ͖ى͜͢Մೳੑͷ͋Δ ࣮ߦ࣌ΠϕϯτͰ͋Δɻ” • “ϧʔνϯ͕ܖ໿Λຬͨ͢ঢ়ଶͰ࣮ߦΛऴ͑ͨ৔߹ɺͦͷ ϧʔνϯίʔϧ͸੒ޭͰ͋Δɻ੒ޭ͠ͳ͚Ε͹ࣦഊͰ͋ Δɻ” 『オブジェクト指向⼊⾨ 第2番

    原則・コンセプト P528』
  15. ܖ໿ͱྫ֎ • ϧʔνϯ(ϝιου΍ؔ਺)͸ɺ • ݺͼग़͠ଆʹʮࣄલ৚݅Λຬͨ͢͜ͱʯΛཁٻ͢Δ • ݺͼग़͠ଆʹʮࣄޙ৚݅Λຬͨ͢͜ͱʯΛอূ͢Δ • ͜ΕΒ͕ຬͨ͞Εͳ͍ঢ়گ͕ྫ֎ •

    ϧʔνϯ͸ॲཧΛதஅ͠ɺݺͼग़͠ݩʹޙॲཧΛҕͶΔ • ݺͼग़͠ݩ͸ʮྫ֎ʯΛड͚औͬͯɺճ෮ΛࢼΈΔ • ճ෮Ͱ͖ͳ͍ͳΒʮࣦഊʯͱͳΔ
  16. ͭ·ΓԿ͕ҧ͏Μͩʁʁ ࣗ෼ͷதͰͷ;Θʙʙʙͬͱͨ͠ײ֮Ͱ͍͏ͱɺ • Τϥʔ͸ɺʮϓϩάϥϜʯͱʮ࣮ߦऀ(ॲཧܥ΍࣮ߦ؀ ڥ)ʯͷؔ܎ੑͷதͰʮͪΌΜͱಈ͔ͳ͍ʯঢ়گ • ྫ֎͸ɺʮݺͼग़͠ݩʯͱʮݺͼग़͞Εͨଆʯͷؔ܎ੑͷ தͰʮܖ໿Λશ͏Ͱ͖ͳ͍ʯঢ়گ Έ͍ͨͳΠϝʔδͰ͓Γ·͢ɻ

  17. ൃੜ͢Δ৔ॴɺൃੜͤ͞Δओମͷҧ͍ • Τϥʔ͸ɺ “PHPΤϯδϯࣗମ͕ΤϥʔΛ௨஌͢Δ࣌ʹ࢖ ͏” (ʰPHPͷΤϥʔͱྫ֎࠶ೖ໳ P51ʱ) • ʹಈ͔ͳͯ͘ɺ͓͔͍͠ •

    ྫ֎͸ɺൃੜͤ͞Δ(=throw͢Δ)ͷ͸͋͘·Ͱʮϓϩάϥ ϜࣗମʯʮϩδοΫʯͱͳΔ • ʹಈ͘͜ͱ͕ग़དྷͯɺ͓͔͍͠
  18. §2: エラー、例外のハンドリング

  19. ΤϥʔϨϕϧ Τϥʔ͕ى͖ͨ࣌ʹɺͦͷϨϕϧʹΑͬͯॲཧ͕ҟͳΔ 1. ॲཧΛఀࢭ͢Δ΋ͷ: Τϥʔ 2. ॲཧΛଓߦ͢Δ΋ͷ: ܯࠂɺ஫ҙ 3. ෮چ͠ͳ͍ͱॲཧΛఀࢭ͢Δ΋ͷ:

    ෮چՄೳͳΤϥʔ
  20. Τϥʔ(க໋తͳΤϥʔ) • ॏେͳΤϥʔͰ͋Γɺॲཧ͕ఀࢭ͞ΕΔ(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
  21. ܯࠂɺ஫ҙ • ๬·͘͠ͳ͍͕ॲཧͷଓߦ͕Մೳͳ΋ͷ • E_WARNINGɺE_NOTICEɺE_DEPRECATEDͳͲ • set_error_handler()ͰϋϯυϥΛఆٛͰ͖Δ PHP: set_error_handler -

    Manual https://www.php.net/manual/ja/function.set-error-handler.php
  22. ෮چՄೳͳΤϥʔ(ัଊՄೳͳக໋తͳΤϥʔ) • ”ةݥͳΤϥʔ͕ൃੜ͕ͨ͠ɺ Τϯδϯ͕ෆ҆ఆͳঢ়ଶʹͳ Δ΄ͲͰ͸ͳ͍” • E_RECOVERABLE_ERROR • set_error_handler()Ͱఆٛͨ͠ϋϯυϥΛ௨ա͢Δɻ •

    ͦͷ಺෦Ͱͷ݁ՌʹΑͬͯɺॲཧ͕෮چ΋͘͠͸E_ERROR ѻ͍ʹͳΔ
  23. error_handlerでキャッチする例

  24. ·ͱΊ • Τϥʔʹ͸Ϩϕϧ͕͋Δ • ϨϕϧʹΑͬͯൃੜޙͷڍಈ͕ҟͳΔ • ॲཧ͕ଓߦ͢Δ(ܯࠂ)΋ͷ • ॲཧ͕தஅ͞ΕΔ(க໋త)΋ͷ

  25. $3. PHP7〜PHP8とエラー

  26. PHP7: Error, Throwableͷಋೖ • PHP7͔ΒɺʮPHPΤϯδϯͷΤϥʔʯͷҰ෦͕ \Errorʹม׵͞ΕΔΑ͏ʹͳͬͨ • ͜Ε͸\Exceptionͱಉ͘͡ɺtry-catchͰัଊͰ͖Δ΋ͷ • ͨͩ͠ྫ֎Ͱ͸ͳ͍ʂʂ

    • ૂ͍ͱͯ͠͸ʮக໋తͳΤϥʔɺัଊՄೳͳக໋తͳΤϥʔ(ͷҰ෦) Λѻ͍΍͘͢͢Δʯͱ͍͏΋ͷ
  27. க໋తͳ/෮چՄೳͳΤϥʔͷ՝୊ RFCΛΈΔͱɾɾ • Τϥʔϋϯυϥ͕ݺ͹Εͳ͍఺(௚઀shutdownॲཧʹೖΔ) • finallyϒϩοΫ͕ݺ͹Εͳ͍ • __destruct͕ݺ͹Εͳ͍ • ΧελϜϋϯυϥ͕ͳ͍ͱɺʮ෮چՄೳʯͰ΋෮چ͠ͳ͍

    参考: PHP: rfc:engine_exceptions_for_php7 https://wiki.php.net/rfc/engine_exceptions_for_php7
  28. Errorをキャッチする例

  29. Կ͕Errorʹͳ͔ͬͨʁ • શͯͷக໋తͳΤϥʔ͕\Errorʹͳͬͨ༁Ͱ͸ͳ͍ • ࣮૷্ͷ౎߹ͱ͔͋Δ • όʔδϣϯʹԠͯ͡\Errorͷద༻ൣғ͕૿͍͑ͯΔ • 7.1: ؔ਺ʹ౉͢Ҿ਺͕গͳ͍৔߹(ArgumentCountError)

    • 8.0: ະఆٛͷඇम০ͷఆ਺΁ͷΞΫηεͨ͠৔߹ • 8.0: ഑ྻ΁ͷΦϑηοτʹෆਖ਼ͳܕΛར༻ͨ͠৔߹
  30. 参考: PHP: 下位互換性のない変更点 - Manual https://www.php.net/manual/ja/migration80.incompatible.php PHP8ͷΤϥʔ • ʮϝδϟʔόʔδϣϯ্͕Δ͔ΒΤϥʔϨϕϧݟ௚ͦ͏ͥʯ •

    Notice -> Warning • ະఆٛͷม਺΍ϓϩύςΟΛಡΈऔΖ͏ͱͨ͠৔߹ • ΦϒδΣΫτͰͳ͍஋ͷϓϩύςΟΛಡΈऔΖ͏ͱͨ͠৔߹ • ഑ྻͰͳ͍஋ͷΠϯσοΫεʹΞΫηε͠Α͏ͱͨ͠৔߹
  31. 参考: PHP: rfc:consistent_type_errors https://wiki.php.net/rfc/consistent_type_errors ඪ४ؔ਺ͷܕνΣοΫ • ඪ४ؔ਺Ͱͷܕҧ൓࣌ʹ\TypeError͕throw͞ΕΔΑ͏ʹ https://www.php.net/releases/8.0/ja.php

  32. ͦͷଞͷ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
  33. ·ͱΊ • PHP7ͷ\Errorͷొ৔ʹΑͬͯɺ ʮϓϩάϥϛϯάͷΤϥʔʯʹ޲͖߹͍΍͘͢ͳ͍ͬͯΔ • PHP8Ͱ͸ɺ\Errorͷ֦େ΍ΤϥʔϨϕϧͷҾ্͖͕͛ݟΒ Εͨ • ૯ͯ͡ʮΑΓݎ࿚ʹίʔυΛॻ͖΍͘͢ͳ͍ͬͯΔʯͱ͍ ͏ҹ৅Λड͚Δ

  34. $4. エラー、例外とどう付き合うか

  35. ॾਕͷ݋: ͏·͘෇͖߹͑͹ඒຯ͍͠ • Notice, Warningͱ͍͏Τϥʔ͸ಈ࡞ΛࢭΊ͸͠ͳ͍ • ͱ͸͍͑ɺແࢹ͍͍ͯͯ͠ͷʁ • \Throwable(\Error)͸\Exceptionͱಉ͘͡ัଊ͕ग़དྷΔ •

    ͱ͸͍͑ɺԿͰ΋Ωϟον͍͍ͯ͠ͷʁ
  36. ͳͥʮΤϥʔʯʮྫ֎ʯ͕͋Δͷ͔ • ʮϓϩάϥϜΛ࣮ߦ͢Δ্Ͱͷෆ౎߹ʯʹ͍ͭͯɺ ։ൃऀ΍Ϣʔβʔʹ஌ΒͤΔͨΊͷ࢓૊Έ • ʮ͍͍ײ͡ʹѻͬͯ͘ΕΔʯ͜ͱΛظ଴͍ͯ͠Δϋζ • ରԠ͕ඞཁͳՕॴͷݦࡏԽ • ద੾ͳऴྃ࣌ॲཧ

    • ϩΪϯά΍௨஌
  37. ัଊ͢΂͖΋ͷɾ͢΂͖Ͱͳ͍΋ͷ • ัଊ͢΂͖΋ͷ • =ຊ൪Ͱൃੜ͠ಘΔ͕ɺϓϩάϥϜ͕ࣗྗͰճ෮౳ͷॲཧΛߦ͏ • ัଊ͢΂͖Ͱͳ͍΋ͷ • = ։ൃ࣌ʹରॲͰ͖Δ΋ͷ

    • = ൃੜͯ͠΋ɺճ෮౳ͷॲཧ͕ߦ͑ͳ͍΋ͷ
  38. Τϥʔ͸ͳͥ͋Δͷ͔ʁ • PHPతʹʮக໋తʯͰ͸ͳ͔ͬͨͱͯ͠΋ɺ ʮ๬·͘͠ͳ͍ʯঢ়گΛ௨஌͢Δ΋ͷ • ͋͘·ͰʮϓϩάϥϜΛ࣮ߦͰ͖Δʯ͚ͩͰ͋Γɺ ։ൃऀ΍Ϣʔβʔͷҙਤͷ๦͛ʹͳ͍ͬͯΔՄೳੑ • (Ͳ͏͠Α͏΋ͳ͍΋ͷΛআ͖) ։ൃஈ֊ʹ͓͍ͯະવʹ๷͙΂͖΋ͷ

  39. ྫ֎͸ͳͥ͋Δͷ͔ʁ • ʮࠓͷॲཧΛதࢭͯ͠ɺݺͼग़͠ݩʹੋඇΛ໰͏ʯ΋ͷ • ݺͼग़͠ݩͰՄೳͳ൑அ͸2ͭ 1. ัଊͯ͠ɺࣄޙॲཧΛߦ͏ 2. ัଊͤͣ(΋͘͠͸ัଊ্ͨ͠Ͱ)ɺߋʹ্ʹੋඇΛ໰͏ •

    (Ͳ͏͠Α͏΋ͳ͍΋ͷΛআ͖) ։ൃஈ֊Ͱ೺Ѳ͠ɺద੾ʹϋϯυϦϯάΛࢼΈΔ΂͖΋ͷ
  40. \Throwable, \Error͸Ͳ͏͔ʁ • \ThrowableΛัଊ͢Δ = \ExceptionҎ֎΋ัଊ͢Δ = \ErrorΛัଊ͢Δ • \Error͸͋͘·ͰʮPHPΤϯδϯͷΤϥʔʯɻ

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

    \LogicException: ϩδοΫͷϛε => ੹೚͸։ൃऀʹ͋Δɻຊ൪Ͱڐ༰͠ͳ͍ • \RuntimeException: ࣮ߦ࣌ͷҟৗ => ୭΋ѱ͘Ͷ͑ɾɾɾ͔΋஌Εͳ͍ɻຊ൪Ͱߟྀ͢Δ
  42. ։ൃऀͷ੹೚ • ʮιʔείʔυΛؤுͬͯௐ΂Ε͹࣏ࠜͰ͖Δʯ΋ͷ͸ɺ ։ൃऀ͕੹೚Λ࣋ͬͯରԠ͍͖͍ͯͨ͠ • ͦΕʹΑͬͯʮຊ൪؀ڥͰ͸ੜ͡ͳ͍ʯ໰୊ʹͳΔ • ʮຊ൪؀ڥͰੜ͡ͳ͍ʯ΋ͷ͸ɺ ʮιʔείʔυͷதͰัଊ͠ͳ͍ʯΑ͏ʹ͢Δ •

    ࠜຊతʹʮੜ͡ͳ͍ʯ໰୊ͳΒʮճ෮ʯΛࢼΈΔඞཁ͕ͳ͍
  43. 参考: 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ͱ͍ͬͨ΋ͷ • ʮัଊର৅ͷείʔϓ͕޿͗͢Δʯ৔߹ͰͷϩΪϯά౳ͷ໨త
  44. 参考: PHP7 の assert による簡易テストはいいぞ。 | 株式会社インフィニットループ技術ブログ https://www.infiniteloop.co.jp/blog/2016/12/php-assertion-expectation/ \LogicException͸ัଊ͢Δ΂͖Ͱͳ͍ •

    ʮܖ໿͞Εͨࣄલ(ޙ)৚݅Λຬ͍ͨͯ͠ͳ͍ʯ͜ͱʹΑΔ ΋ͷ • ʮਖ਼͘͠ݺͼग़͞ΕͨΒਖ਼͘͠ಈ͘ʯΑ͏ʹ͢Δͷ͸ ։ൃऀͷ(։ൃ࣌ʹ͓͚Δ)࢓ࣄ • ؔ࿈: assert()
  45. \RuntimeException͸৭ʑ͋Δ • ʮ࣮ߦ࣌ɾຊ൪Ͱى͜Γ͏Δʯ΋ͷͰɺ ։ൃऀ͕ؤுͬͯ΋ى͖ͯ͠·͏ྫ֎తͳঢ়گ • ʮัଊͯ͠΋࢓ํ͕ͳ͍ʯ΋ͷ͸εϧʔ͍ͯ͘͠ • ʮճ෮ΛࢼΈΔʯʮޙॲཧΛߦ͏ʯ΋ͷ͸ัଊ͍ͯ͘͠ • ޙऀʹ͍ͭͯ͸finallyͷར༻΋ݕ౼

    参考: PHP でどのように Exception/RuntimeException/LogicException を使い分けるか - Qiita https://qiita.com/tanakahisateru/items/e3e24f3825c4ba0c60e6
  46. ·ͱΊ • ൃੜͨ͠੹೚͸Ͳ͜ʹ͋Δͷ͔ʁʹԠͯ͡ɺ ։ൃஈ֊orϓϩάϥϜ಺ͰରԠ͍ͯ͘͠ • \Throwable΍\Error͸ ʮัଊͯ͠ରԠ͢ΔʯͷͰ͸ͳ͘ʮະવʹ๷͙ʯΑ͏ʹ͢Δ • \LogicException͸ʮ։ൃऀ͕ରԠ͢Δʯ΂͖΋ͷ \RuntimeException͸ʮҰఆى͖ͯ͠·͏ͷͰࣄޙରԠ͢Δ(orఘΊΔ)ʯ

    ΂͖΋ͷ
  47. $5.「例外」を活⽤して⾒通しを良く

  48. ݟ௨͠ʁ • ʮ͜ΕΛ࣮ߦͨ͠ΒɺԿ͕ى͜ΔՄೳੑ͕͋Δ͔ʯ͕ ൑વͱ͍ͯ͠Δͷ͕ʮݟ௨͠ͷྑ͞ʯ • ࣍ͷΑ͏ͳςΫχοΫͰྫ֎ͷརศੑ͕ߴ·Δ • ಠࣗྫ֎ • ྫ֎຋༁

    • @throwsλάͷ׆༻
  49. ಠࣗྫ֎Λར༻͢Δ • ྫ֎Λѻ͏ࡍʹʮᐆດͰͳ͍Α͏ʹ͢Δʯͱ͍͏ͷ͕جຊ • Ξϯνύλʔϯ: ϙέϞϯྫ֎ϋϯυϦϯά • ΋͠ʮ\ExceptionΛ౤͛Δϝιουʯ͕͋ͬͨΒɺ ݺͼग़͠ݩ͸ `catch(\Exception)`ͤ͟ΔΛಘͳ͍

    • ҙਤ͠ͳ͍(=ัଊͯ͠΋࢓ํͷͳ͍)ྫ֎ΛҾֻ͚ͬΔϦ εΫ
  50. ಠࣗྫ֎Λར༻͢Δ • ࣗ෼ͨͪͷΞϓϦέʔγϣϯ಺Ͱྫ֎ΛମܥԽͯ͠ఆ͍ٛͯ͘͠ • ͋͘·ͰʮϋϯυϦϯά͠΍͘͢͢Δʯͷ͕໨త • ԿͰ΋ಠࣗྫ֎Λ࢖͏΂͖ɺͱ͍͏͜ͱͰ͸ͳ͍ • 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
  51. ྫ֎຋༁ • “্ҐϨΠϠ͸ԼҐϨϕϧͷྫ֎ΛΩϟονͯ͠ɺ্ҐϨΠϠͷதͰɺ্ҐϨϕϧ ͷந৅֓೦ͷ؍఺͔Βઆ໌Մೳͳྫ֎Λεϩʔ͢΂͖Ͱ͢” (ʰEffective Java ୈ3൛ P302ʱ) • ྫ͑͹ʮ֎෦APIͷΫϥΠΞϯτΫϥε͕GuzzleHttp\ExceptionΛ౤͖͛ͯͨʯ৔

    ߹ʹɺ ʮAPIΛར༻͢ΔαʔϏεΫϥε͕ɺద੾ͳ຋༁Λ͢Δʯ͜ͱͰɺ ʮαʔϏεΫϥεͷར༻ऀ͸࣮૷ৄࡉ(GuzzleHttp)Λ஌Βͳͯ͘͢ΉʯΑ͏ʹͳΔ • ʮ༷ʑͳࣄ৘(ྫ֎ΦϒδΣΫτ)ʹରԠͯ͠ɺݺͼग़͠ݩͷؔ৺ʹԊ͏Α͏ͳղ૾ ౓ʹม׵͢Δʯͱ͍ͬͨ͜ͱ΋Մೳ
  52. @throwsλάͷ׆༻ • ʮੜ͡͏Δશͯͷྫ֎ʯΛ@throwsʹهड़͢Δඞཁ͸ͳ͍ • ORM΍DBA͕͍͍ͪͪ\PDOExceptionΛॻ͘ͱʮݟ௨͕͠ѱ͍ʯ • APIࣗΒ͕ݺͼग़͠ݩʹʮରԠͯ͠΄͍͠ʯ΋ͷΛબ୒͠ɺهड़͢Δ • ΋͠ʮൃੜ͠ಘΔ͕ɺัଊ͢Δඞཁ͸ͳ͍ʯ΋ͷΛ஫ҙשى͢Δ৔߹͸ɺ׶͑ͯ @throwsλάΛ༻͍ͣʹphpdocʹॻ͘ͷ΋1ͭͷख

    • ྫ͑͹\LogicExceptionܥͷྫ֎͸ʮัଊͯ͠΄͍͠ʯ΋ͷͰ͸ͳ͍͕ɺݺͼग़ ͠ݩʹೝ͓͍ࣝͯͯ͠΋Β͍͍ͨ • ※ ϥΠϒϥϦ΍FWͷίʔυͷ৔߹͸ࣄ৘͕ҟͳΓͦ͏
  53. ·ͱΊ • ʮྫ֎ʯΛѻ͏ࡍʹ͸ɺ ʮݺͼग़͠ଆʹԿΛ఻͍͔͑ͨʯΛҙࣝ͢Δ • ʮ͢΂ͯʯΛ఻͑Δͷ͸ෆՄೳͰɺݟ௨͠΋ѱ͘͢Δ • ࣗΒͷ੹೚Λࣔͭͭ͠ɺ ݺͼग़͠ଆʹෛΘ͍ͤͨ੹೚΋໌Β͔ʹ͍ͯ͘͠ҙࣝ

  54. $X 最後に

  55. ͜ͷηογϣϯͰ఻͔͑ͨͬͨ͜ͱ • PHP7->8ͱɺঃʑʹʮΤϥʔͱ෇͖߹͍΍͍͢ʯݴޠʹͳ͍ͬͯ·͢ʂ • خ͍͠ʙʙʂʂ • \Error΍\ThrowableΛัଊ͢Δͷ͸΍Ί·͠ΐ͏ • ʮରԠ͢΂͖λΠϛϯάʯ͕ExceptionͱҟͳΓ·͢ •

    ʮຊ൪Ͱੜ͡ಘΔ΋ͷʯΛcatch͢ΔɺͦΕҎ֎͸։ൃதʹ௚͢ • ʮݟ௨͠ʯΛҙࣝ͠ͳ͕Βʮྫ֎ʯͱ෇͖߹͍͖͍ͬͯͨͰ͢Ͷʂ • νʔϜͰͷҙࣝ߹Θ͕ͤඞਢͱࢥ͍·͢ʂ
  56. ご清聴 ありがとうございました🎉

  57. $XX 参考⽂献

  58. ʮ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
  59. ΤϥʔϋϯυϦϯάܥ • 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
  60. ྫ֎ͷઃܭͳͲ • ݎ࿚ੑΛߴΊͨΓɺ։ൃମݧΛ޲্ͤ͞ΔͨΊʹʮͲͷΑ ͏ʹྫ֎Λ࢖͍͜ͳ͔͢ʯͷࢦ਑ͱͳΔهࣄͰ͢ • 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
  61. 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
  62. 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
  63. Ҿ༻ͨ͠ॻ੶ɾؔ࿈ॻ੶ • ຊηογϣϯʹͯҾ༻ͨ͠ॻ੶΍ɺ Τϥʔ΍ྫ֎ͱʮ޲͖߹͏ʯʮཧղΛਂΊΔʯͷʹ໾ཱͭॻ ੶Ͱ͢ • オブジェクト指向⼊⾨ 第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