Slide 1

Slide 1 text

Try::Tiny再入門 2021/5/21 Gotanda.pm#20 dorapon2000

Slide 2

Slide 2 text

% whoami - 久保田享祐 / @dorapon2000 - モバイルファクトリー エンジニア - Perl歴1年のひよっこ - 入社してから覚えました - 最近ハマっていること - 著作権法 - 好きな判例は駒込大観音事件(控訴審)です - 読書 - 辻村深月は天才だということに今更ながら気づきました - はてなブログ → https://dorapon2000.hatenablog.com/ 2

Slide 3

Slide 3 text

Perlでの素朴な例外処理 - https://perldoc.jp/func/eval - perlではeval構文と$@で例外処理を実現する - evalはBLOCK内のコードを一度だけパースして perlとして実行する - eval内部で、構文エラー・実行エラー・ dieが発生した場合、その時点で実行を終了して、 $@にエ ラーメッセージを設定する 3 Error occur: MyError at path/to/script.pl line 1.

Slide 4

Slide 4 text

Try::Tinyとは - https://metacpan.org/pod/Try::Tiny - Perlで try / catch / finally 文実現させてくれる偉大なモジュール 4

Slide 5

Slide 5 text

Try::Tinyとは - https://metacpan.org/pod/Try::Tiny - Perlで try / catch / finally 文実現させてくれる偉大なモジュール 5 try {...} catch {...} finally {...} ;

Slide 6

Slide 6 text

Try::Tinyとは - https://metacpan.org/pod/Try::Tiny - Perlで try / catch / finally 文実現させてくれる偉大なモジュール 6 try {...} catch {...} finally {...} ; 🤔 なにこれ??!?

Slide 7

Slide 7 text

try / catch / finally の構文解釈 7 try( sub {...}, catch( sub {...}, finally( sub {...} ))) ; 第一引数のプロトタイプに &を指定すると、つまり CODE Refなのは明らかなので subを省略可能。おまけで ,も 第一引数として渡された場合、 &は sub キーワー ドや連続したカンマを 要求しないような無名サブ ルーチンを要求します。 サブルーチンの()は省略可能。省略する とリスト演算子(左方向)の優先順位に 従って、右側から評価されていく

Slide 8

Slide 8 text

ソースコード https://metacpan.org/release/Try-Tiny/source/lib/Try/Tiny.pm 1. finally が①を受け取る 2. catch が②と①を受け取る 3. try が③と②と①を受け取る a. ①を ScopeGurd のオブジェクトに登録 b. eval {③} をする c. $@があれば②を実行する d. 終了(ScopeGurdオブジェクトがGCされる) 4. ScopeGurdのDESTROYが発火して①を実行 8 try catch finally ScodeGurd try( sub {③}, catch( sub {②}, finally( sub {①} ))) ; try文 catch文 finally文

Slide 9

Slide 9 text

finally 9 使われない finallyはblessしてるだけ tryの条件分岐で使う

Slide 10

Slide 10 text

catch 10 finallyの返り値 仕組みはfinallyと全く同じ

Slide 11

Slide 11 text

try① finallyのために 11 finally文をScopeGuardに登録 参照されることはないが tryサブルーチンの終了まで保持 catchの返り値

Slide 12

Slide 12 text

try② try文の実行 12 Try::Tinyも本質は evalと$@による例外処理 try文の実行

Slide 13

Slide 13 text

try③ catch文の実行 13 catch文の実行 evalで失敗して catch文があれば これにてtryサブルーチンは終了

Slide 14

Slide 14 text

ScopeGuard 14 tryサブルーチンの終了時に $_finally_guards がGCされる ため DESTROY が実行される finallyの実行 $@

Slide 15

Slide 15 text

はい🙃 15

Slide 16

Slide 16 text

Try::Tinyとは(再掲) - https://metacpan.org/pod/Try::Tiny - Perlで try / catch / finally 文実現させてくれる偉大なモジュール 16 try {...} catch {...} finally {...} ;

Slide 17

Slide 17 text

Try::Tinyとは(再掲) - https://metacpan.org/pod/Try::Tiny - Perlで try / catch / finally 文実現させてくれる偉大なモジュール 17 try {...} catch {...} finally {...} ; 🥳 わかる!!(進化)

Slide 18

Slide 18 text

明日使えない気づき finallyの後ろにいくつもfinallyを繋げられる 18 catch at /path/to/script.pl line 6. finally 1 at /path/to/script.pl ine 12. finally 2 at /path/to/script.pl line 10. finally 3 at /path/to/script.pl line 8.

Slide 19

Slide 19 text

参考 - https://ja.stackoverflow.com/questions/7549/ - https://metacpan.org/pod/Try::Tiny - https://perldoc.jp/docs/perl/5.30.0/perlvar.pod - https://perldoc.jp/func/eval - https://perldoc.jp/docs/perl/5.30.0/perlsub.pod - https://perldoc.jp/docs/perl/5.30.0/perlobj.pod 19

Slide 20

Slide 20 text

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