PHP6でtry catch finally
PHP4,5,6共にfinally節が無い
PHP6のgotoを利用してそれっぽくしてみる
namespace Sample::TEST; class myException extends exception { public function __construct($_message) { parent::__construct($_message); } public function getMyMessage() { return $this->getMessage(); } } class test { public $message; public function __construct($_message) { $this->message = $_message; } public function main() { throw new myException($this->message); } } echo "start\n"; try { $error = new Sample::TEST::test("warning!!\n"); $error->main(); goto end; throw new exception("error exception\n"); } catch (myException $e) { echo "catch myException\n"; echo $e->getMyMessage(); goto finally; } catch (exception $e) { echo "catch exception\n"; echo $e->getMessage(); goto finally; } finally: { echo "finally\n"; } end: echo "finish\n";
実行結果
start
catch myException
warning!!
finally
finish
$error->main();の箇所コメントアウトして実行してもfinally: {***}の箇所はgotoで飛ばされるので処理されない
う〜ん、、、、
微妙だ。。。
[追記 - 20110128]
最近この記事に結構アクセスあるのと
間違った情報が広がるのは良くないので追記。
この記事書いた当時は[finally]ってのはexceptionが発生した時のみ実行される様に思っていたのですが
finallyって絶対に実行されるものだったんですね。
他の言語、例えばpythonだと
#!/usr/bin/env python if __name__ == "__main__": try: print "try" raise Exception("except") except Exception, e: print e finally: print "finally"
と書けて実行すると
となる
try
except
finally
って事で
try {
throw HogeException('hoge');
} finally {
print "finally";
}
と書いてもprint "finally"が実行される様に自分で実装しないといかんと。
「じゃあcatchで受け取ればいいじゃない」とかってなったのかな。。。
PHPェ・・・