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ェ・・・