LoginSignup
2

More than 5 years have passed since last update.

__toString()での例外処理

Last updated at Posted at 2018-05-27

__toString

__toString() メソッド内から例外を投げることはできません。そうした場合、致命的なエラーが発生します。

これでは困ります。

trigger_error

メソッドをprivateメソッドに変更し(例えばtoString )、try-catchで呼び出しエラーに変換します。

public function __toString()
{
    try {
        return $this->toString();
    } catch (\Exception $e) {
        trigger_error($e->getMessage() . PHP_EOL . $e->getTraceAsString(), E_USER_ERROR);
        return '';
    }
 }

テスト

phpunitは__toStringでのエラー発生は例外に変換しないので通常の例外に変換されたPHPエラーを期待するテストはうまくいきません。下記のように一時的にset_error_handlerをセットして記述できます。

$errNo = $errStr = '';
set_error_handler(function (int $no, string $str) use (&$errNo, &$errStr) {
    $errNo = $no;
    $errStr = $str;
});
// __toStringで例外発生させる
$this->assertSame(256, $errNo);
$this->assertContains('foo', $errStr);
// ハンドラー復帰
restore_error_handler();

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2