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

hideki kinjyo
PRO

March 27, 2021
Tweet

More Decks by hideki kinjyo

Other Decks in Programming

Transcript

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

    View Slide

  2. ࣗݾ঺հ
    • ⾦城秀樹 / きんじょうひでき
    • GitHub: @o0h / Twitter: @o0h_
    • 好きなFWはCakePHP
    • アイコンは
    美味しい鮭親⼦丼の写真です

    View Slide

  3. ちゃんとしたプログラムが書きたい・・
    書きたくない・・・?

    View Slide

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

    View Slide

  5. 「意図がわかる」
    「失敗を防げる」
    「復旧しやすい」
    というのは1つの価値になる(ハズ)

    View Slide

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

    View Slide

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

    View Slide

  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

    View Slide

  9. §1: エラー、例外ってなんだ!?

    View Slide

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

    View Slide

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

    View Slide

  12. ৭ʑͳΤϥʔ͕͋Δ
    • จ๏Τϥʔ
    • ແݶϧʔϓ
    • Ϋϥε໊΍ؔ਺໊ͷॏෳ
    • ϝϞϦᷓΕ
    • ॻ͖ࠐΈݖݶͷෆ଍
    • θϩআࢉ
    • ܕએݴͱͷෆҰக
    • Interfaceͷະ࣮૷
    • ະఆٛͷม਺ͷར༻
    • ෆՄೳͳΩϟετ

    View Slide

  13. ྫ֎ʁ
    • (php.netᐌ͘)ଞͷϓϩάϥϛϯάݴޠʹࣅͨྫ֎Ϟσϧ
    PHP: 例外(exceptions) - Manual
    https://www.php.net/manual/ja/language.exceptions.php

    View Slide

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

    View Slide

  15. ܖ໿ͱྫ֎
    • ϧʔνϯ(ϝιου΍ؔ਺)͸ɺ
    • ݺͼग़͠ଆʹʮࣄલ৚݅Λຬͨ͢͜ͱʯΛཁٻ͢Δ
    • ݺͼग़͠ଆʹʮࣄޙ৚݅Λຬͨ͢͜ͱʯΛอূ͢Δ
    • ͜ΕΒ͕ຬͨ͞Εͳ͍ঢ়گ͕ྫ֎
    • ϧʔνϯ͸ॲཧΛதஅ͠ɺݺͼग़͠ݩʹޙॲཧΛҕͶΔ
    • ݺͼग़͠ݩ͸ʮྫ֎ʯΛड͚औͬͯɺճ෮ΛࢼΈΔ
    • ճ෮Ͱ͖ͳ͍ͳΒʮࣦഊʯͱͳΔ

    View Slide

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

    View Slide

  17. ൃੜ͢Δ৔ॴɺൃੜͤ͞Δओମͷҧ͍
    • Τϥʔ͸ɺ “PHPΤϯδϯࣗମ͕ΤϥʔΛ௨஌͢Δ࣌ʹ࢖
    ͏” (ʰPHPͷΤϥʔͱྫ֎࠶ೖ໳ P51ʱ)
    • ʹಈ͔ͳͯ͘ɺ͓͔͍͠
    • ྫ֎͸ɺൃੜͤ͞Δ(=throw͢Δ)ͷ͸͋͘·Ͱʮϓϩάϥ
    ϜࣗମʯʮϩδοΫʯͱͳΔ
    • ʹಈ͘͜ͱ͕ग़དྷͯɺ͓͔͍͠

    View Slide

  18. §2: エラー、例外のハンドリング

    View Slide

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

    View Slide

  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

    View Slide

  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

    View Slide

  22. ෮چՄೳͳΤϥʔ(ัଊՄೳͳக໋తͳΤϥʔ)
    • ”ةݥͳΤϥʔ͕ൃੜ͕ͨ͠ɺ Τϯδϯ͕ෆ҆ఆͳঢ়ଶʹͳ
    Δ΄ͲͰ͸ͳ͍”
    • E_RECOVERABLE_ERROR
    • set_error_handler()Ͱఆٛͨ͠ϋϯυϥΛ௨ա͢Δɻ
    • ͦͷ಺෦Ͱͷ݁ՌʹΑͬͯɺॲཧ͕෮چ΋͘͠͸E_ERROR
    ѻ͍ʹͳΔ

    View Slide

  23. error_handlerでキャッチする例

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  27. க໋తͳ/෮چՄೳͳΤϥʔͷ՝୊
    RFCΛΈΔͱɾɾ
    • Τϥʔϋϯυϥ͕ݺ͹Εͳ͍఺(௚઀shutdownॲཧʹೖΔ)
    • finallyϒϩοΫ͕ݺ͹Εͳ͍
    • __destruct͕ݺ͹Εͳ͍
    • ΧελϜϋϯυϥ͕ͳ͍ͱɺʮ෮چՄೳʯͰ΋෮چ͠ͳ͍
    参考: PHP: rfc:engine_exceptions_for_php7
    https://wiki.php.net/rfc/engine_exceptions_for_php7

    View Slide

  28. Errorをキャッチする例

    View Slide

  29. Կ͕Errorʹͳ͔ͬͨʁ
    • શͯͷக໋తͳΤϥʔ͕\Errorʹͳͬͨ༁Ͱ͸ͳ͍
    • ࣮૷্ͷ౎߹ͱ͔͋Δ
    • όʔδϣϯʹԠͯ͡\Errorͷద༻ൣғ͕૿͍͑ͯΔ
    • 7.1: ؔ਺ʹ౉͢Ҿ਺͕গͳ͍৔߹(ArgumentCountError)
    • 8.0: ະఆٛͷඇम০ͷఆ਺΁ͷΞΫηεͨ͠৔߹
    • 8.0: ഑ྻ΁ͷΦϑηοτʹෆਖ਼ͳܕΛར༻ͨ͠৔߹

    View Slide

  30. 参考: PHP: 下位互換性のない変更点 - Manual
    https://www.php.net/manual/ja/migration80.incompatible.php
    PHP8ͷΤϥʔ
    • ʮϝδϟʔόʔδϣϯ্͕Δ͔ΒΤϥʔϨϕϧݟ௚ͦ͏ͥʯ
    • Notice -> Warning
    • ະఆٛͷม਺΍ϓϩύςΟΛಡΈऔΖ͏ͱͨ͠৔߹
    • ΦϒδΣΫτͰͳ͍஋ͷϓϩύςΟΛಡΈऔΖ͏ͱͨ͠৔߹
    • ഑ྻͰͳ͍஋ͷΠϯσοΫεʹΞΫηε͠Α͏ͱͨ͠৔߹

    View Slide

  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

    View Slide

  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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  39. ྫ֎͸ͳͥ͋Δͷ͔ʁ
    • ʮࠓͷॲཧΛதࢭͯ͠ɺݺͼग़͠ݩʹੋඇΛ໰͏ʯ΋ͷ
    • ݺͼग़͠ݩͰՄೳͳ൑அ͸2ͭ
    1. ัଊͯ͠ɺࣄޙॲཧΛߦ͏
    2. ัଊͤͣ(΋͘͠͸ัଊ্ͨ͠Ͱ)ɺߋʹ্ʹੋඇΛ໰͏
    • (Ͳ͏͠Α͏΋ͳ͍΋ͷΛআ͖)
    ։ൃஈ֊Ͱ೺Ѳ͠ɺద੾ʹϋϯυϦϯάΛࢼΈΔ΂͖΋ͷ

    View Slide

  40. \Throwable, \Error͸Ͳ͏͔ʁ
    • \ThrowableΛัଊ͢Δ
    = \ExceptionҎ֎΋ัଊ͢Δ
    = \ErrorΛัଊ͢Δ
    • \Error͸͋͘·ͰʮPHPΤϯδϯͷΤϥʔʯɻ
    • ͜Ε͕ى͖Δͷ͸ɺʮϓϩάϥϛϯάͷΤϥʔʯͱݴ͑Δ
    • ϓϩμΫγϣϯʹग़ՙ͞ΕΔ΂͖Ͱͳ͍ɻ
    ։ൃऀ͸ɺςετ΍ࢼݧ؀ڥͰൃݟͨ͠Βमਖ਼Λ͢΂͖

    View Slide

  41. \Error, \LogicException, \RuntimeException
    \ThrowableͳΦϒδΣΫτΛɺʮൃੜ͢ΔݪҼʯʹԠͯ͡3ͭʹ෼ྨ͢Δ
    • \Error: ϓϩάϥϛϯάͷϛε
    => ੹೚͸։ൃऀʹ͋Δɻຊ൪Ͱڐ༰͠ͳ͍
    • \LogicException: ϩδοΫͷϛε
    => ੹೚͸։ൃऀʹ͋Δɻຊ൪Ͱڐ༰͠ͳ͍
    • \RuntimeException: ࣮ߦ࣌ͷҟৗ
    => ୭΋ѱ͘Ͷ͑ɾɾɾ͔΋஌Εͳ͍ɻຊ൪Ͱߟྀ͢Δ

    View Slide

  42. ։ൃऀͷ੹೚
    • ʮιʔείʔυΛؤுͬͯௐ΂Ε͹࣏ࠜͰ͖Δʯ΋ͷ͸ɺ
    ։ൃऀ͕੹೚Λ࣋ͬͯରԠ͍͖͍ͯͨ͠
    • ͦΕʹΑͬͯʮຊ൪؀ڥͰ͸ੜ͡ͳ͍ʯ໰୊ʹͳΔ
    • ʮຊ൪؀ڥͰੜ͡ͳ͍ʯ΋ͷ͸ɺ
    ʮιʔείʔυͷதͰัଊ͠ͳ͍ʯΑ͏ʹ͢Δ
    • ࠜຊతʹʮੜ͡ͳ͍ʯ໰୊ͳΒʮճ෮ʯΛࢼΈΔඞཁ͕ͳ͍

    View Slide

  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ͱ͍ͬͨ΋ͷ
    • ʮัଊର৅ͷείʔϓ͕޿͗͢Δʯ৔߹ͰͷϩΪϯά౳ͷ໨త

    View Slide

  44. 参考: PHP7 の assert による簡易テストはいいぞ。 | 株式会社インフィニットループ技術ブログ
    https://www.infiniteloop.co.jp/blog/2016/12/php-assertion-expectation/
    \LogicException͸ัଊ͢Δ΂͖Ͱͳ͍
    • ʮܖ໿͞Εͨࣄલ(ޙ)৚݅Λຬ͍ͨͯ͠ͳ͍ʯ͜ͱʹΑΔ
    ΋ͷ
    • ʮਖ਼͘͠ݺͼग़͞ΕͨΒਖ਼͘͠ಈ͘ʯΑ͏ʹ͢Δͷ͸
    ։ൃऀͷ(։ൃ࣌ʹ͓͚Δ)࢓ࣄ
    • ؔ࿈: assert()

    View Slide

  45. \RuntimeException͸৭ʑ͋Δ
    • ʮ࣮ߦ࣌ɾຊ൪Ͱى͜Γ͏Δʯ΋ͷͰɺ
    ։ൃऀ͕ؤுͬͯ΋ى͖ͯ͠·͏ྫ֎తͳঢ়گ
    • ʮัଊͯ͠΋࢓ํ͕ͳ͍ʯ΋ͷ͸εϧʔ͍ͯ͘͠
    • ʮճ෮ΛࢼΈΔʯʮޙॲཧΛߦ͏ʯ΋ͷ͸ัଊ͍ͯ͘͠
    • ޙऀʹ͍ͭͯ͸finallyͷར༻΋ݕ౼
    参考: PHP でどのように Exception/RuntimeException/LogicException を使い分けるか - Qiita
    https://qiita.com/tanakahisateru/items/e3e24f3825c4ba0c60e6

    View Slide

  46. ·ͱΊ
    • ൃੜͨ͠੹೚͸Ͳ͜ʹ͋Δͷ͔ʁʹԠͯ͡ɺ
    ։ൃஈ֊orϓϩάϥϜ಺ͰରԠ͍ͯ͘͠
    • \Throwable΍\Error͸
    ʮัଊͯ͠ରԠ͢ΔʯͷͰ͸ͳ͘ʮະવʹ๷͙ʯΑ͏ʹ͢Δ
    • \LogicException͸ʮ։ൃऀ͕ରԠ͢Δʯ΂͖΋ͷ
    \RuntimeException͸ʮҰఆى͖ͯ͠·͏ͷͰࣄޙରԠ͢Δ(orఘΊΔ)ʯ
    ΂͖΋ͷ

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  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

    View Slide

  51. ྫ֎຋༁
    • “্ҐϨΠϠ͸ԼҐϨϕϧͷྫ֎ΛΩϟονͯ͠ɺ্ҐϨΠϠͷதͰɺ্ҐϨϕϧ
    ͷந৅֓೦ͷ؍఺͔Βઆ໌Մೳͳྫ֎Λεϩʔ͢΂͖Ͱ͢”
    (ʰEffective Java ୈ3൛ P302ʱ)
    • ྫ͑͹ʮ֎෦APIͷΫϥΠΞϯτΫϥε͕GuzzleHttp\ExceptionΛ౤͖͛ͯͨʯ৔
    ߹ʹɺ
    ʮAPIΛར༻͢ΔαʔϏεΫϥε͕ɺద੾ͳ຋༁Λ͢Δʯ͜ͱͰɺ
    ʮαʔϏεΫϥεͷར༻ऀ͸࣮૷ৄࡉ(GuzzleHttp)Λ஌Βͳͯ͘͢ΉʯΑ͏ʹͳΔ
    • ʮ༷ʑͳࣄ৘(ྫ֎ΦϒδΣΫτ)ʹରԠͯ͠ɺݺͼग़͠ݩͷؔ৺ʹԊ͏Α͏ͳղ૾
    ౓ʹม׵͢Δʯͱ͍ͬͨ͜ͱ΋Մೳ

    View Slide

  52. @throwsλάͷ׆༻
    • ʮੜ͡͏Δશͯͷྫ֎ʯΛ@throwsʹهड़͢Δඞཁ͸ͳ͍
    • ORM΍DBA͕͍͍ͪͪ\PDOExceptionΛॻ͘ͱʮݟ௨͕͠ѱ͍ʯ
    • APIࣗΒ͕ݺͼग़͠ݩʹʮରԠͯ͠΄͍͠ʯ΋ͷΛબ୒͠ɺهड़͢Δ
    • ΋͠ʮൃੜ͠ಘΔ͕ɺัଊ͢Δඞཁ͸ͳ͍ʯ΋ͷΛ஫ҙשى͢Δ৔߹͸ɺ׶͑ͯ
    @throwsλάΛ༻͍ͣʹphpdocʹॻ͘ͷ΋1ͭͷख
    • ྫ͑͹\LogicExceptionܥͷྫ֎͸ʮัଊͯ͠΄͍͠ʯ΋ͷͰ͸ͳ͍͕ɺݺͼग़
    ͠ݩʹೝ͓͍ࣝͯͯ͠΋Β͍͍ͨ
    • ※ ϥΠϒϥϦ΍FWͷίʔυͷ৔߹͸ࣄ৘͕ҟͳΓͦ͏

    View Slide

  53. ·ͱΊ
    • ʮྫ֎ʯΛѻ͏ࡍʹ͸ɺ
    ʮݺͼग़͠ଆʹԿΛ఻͍͔͑ͨʯΛҙࣝ͢Δ
    • ʮ͢΂ͯʯΛ఻͑Δͷ͸ෆՄೳͰɺݟ௨͠΋ѱ͘͢Δ
    • ࣗΒͷ੹೚Λࣔͭͭ͠ɺ
    ݺͼग़͠ଆʹෛΘ͍ͤͨ੹೚΋໌Β͔ʹ͍ͯ͘͠ҙࣝ

    View Slide

  54. $X 最後に

    View Slide

  55. ͜ͷηογϣϯͰ఻͔͑ͨͬͨ͜ͱ
    • PHP7->8ͱɺঃʑʹʮΤϥʔͱ෇͖߹͍΍͍͢ʯݴޠʹͳ͍ͬͯ·͢ʂ
    • خ͍͠ʙʙʂʂ
    • \Error΍\ThrowableΛัଊ͢Δͷ͸΍Ί·͠ΐ͏
    • ʮରԠ͢΂͖λΠϛϯάʯ͕ExceptionͱҟͳΓ·͢
    • ʮຊ൪Ͱੜ͡ಘΔ΋ͷʯΛcatch͢ΔɺͦΕҎ֎͸։ൃதʹ௚͢
    • ʮݟ௨͠ʯΛҙࣝ͠ͳ͕Βʮྫ֎ʯͱ෇͖߹͍͖͍ͬͯͨͰ͢Ͷʂ
    • νʔϜͰͷҙࣝ߹Θ͕ͤඞਢͱࢥ͍·͢ʂ

    View Slide

  56. ご清聴
    ありがとうございました🎉

    View Slide

  57. $XX 参考⽂献

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide