Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

Τϥʔ(க໋తͳΤϥʔ) • ॏେͳΤϥʔͰ͋Γɺॲཧ͕ఀࢭ͞ΕΔ(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

Slide 21

Slide 21 text

ܯࠂɺ஫ҙ • ๬·͘͠ͳ͍͕ॲཧͷଓߦ͕Մೳͳ΋ͷ • 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

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

error_handlerでキャッチする例

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

$3. PHP7〜PHP8とエラー

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

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

Slide 28

Slide 28 text

Errorをキャッチする例

Slide 29

Slide 29 text

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

Slide 30

Slide 30 text

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

Slide 31

Slide 31 text

参考: PHP: rfc:consistent_type_errors https://wiki.php.net/rfc/consistent_type_errors ඪ४ؔ਺ͷܕνΣοΫ • ඪ४ؔ਺Ͱͷܕҧ൓࣌ʹ\TypeError͕throw͞ΕΔΑ͏ʹ https://www.php.net/releases/8.0/ja.php

Slide 32

Slide 32 text

ͦͷଞͷ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

Slide 33

Slide 33 text

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

Slide 34

Slide 34 text

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

Slide 35

Slide 35 text

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

Slide 36

Slide 36 text

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

Slide 37

Slide 37 text

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

Slide 38

Slide 38 text

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

Slide 39

Slide 39 text

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

Slide 40

Slide 40 text

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

Slide 41

Slide 41 text

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

Slide 42

Slide 42 text

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

Slide 43

Slide 43 text

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

Slide 44

Slide 44 text

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

Slide 45

Slide 45 text

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

Slide 46

Slide 46 text

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

Slide 47

Slide 47 text

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

Slide 48

Slide 48 text

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

Slide 49

Slide 49 text

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

Slide 50

Slide 50 text

ಠࣗྫ֎Λར༻͢Δ • ࣗ෼ͨͪͷΞϓϦέʔγϣϯ಺Ͱྫ֎ΛମܥԽͯ͠ఆ͍ٛͯ͘͠ • ͋͘·ͰʮϋϯυϦϯά͠΍͘͢͢Δʯͷ͕໨త • ԿͰ΋ಠࣗྫ֎Λ࢖͏΂͖ɺͱ͍͏͜ͱͰ͸ͳ͍ • 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

Slide 51

Slide 51 text

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

Slide 52

Slide 52 text

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

Slide 53

Slide 53 text

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

Slide 54

Slide 54 text

$X 最後に

Slide 55

Slide 55 text

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

Slide 56

Slide 56 text

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

Slide 57

Slide 57 text

$XX 参考⽂献

Slide 58

Slide 58 text

ʮ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

Slide 59

Slide 59 text

ΤϥʔϋϯυϦϯάܥ • 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

Slide 60

Slide 60 text

ྫ֎ͷઃܭͳͲ • ݎ࿚ੑΛߴΊͨΓɺ։ൃମݧΛ޲্ͤ͞ΔͨΊʹʮͲͷΑ ͏ʹྫ֎Λ࢖͍͜ͳ͔͢ʯͷࢦ਑ͱͳΔهࣄͰ͢ • 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

Slide 61

Slide 61 text

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

Slide 62

Slide 62 text

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

Slide 63

Slide 63 text

Ҿ༻ͨ͠ॻ੶ɾؔ࿈ॻ੶ • ຊηογϣϯʹͯҾ༻ͨ͠ॻ੶΍ɺ Τϥʔ΍ྫ֎ͱʮ޲͖߹͏ʯʮཧղΛਂΊΔʯͷʹ໾ཱͭॻ ੶Ͱ͢ • オブジェクト指向⼊⾨ 第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