web-dev-qa-db-ja.com

php:すべての例外をキャッチしないtry-catch

私は次のことをしようとしています:

try {
    // just an example
    $time      = 'wrong datatype';
    $timestamp = date("Y-m-d H:i:s", $time);
} catch (Exception $e) {
    return false;
}
// database activity here

要するに、データベースに入れる変数をいくつか初期化します。何らかの理由で初期化が失敗した場合-例$ timeは予期される形式ではないため、メソッドがfalseを返し、間違ったデータをデータベースに入力しないようにします。

ただし、このようなエラーは「catch」ステートメントではなく、グローバルエラーハンドラーによってキャッチされます。そして、スクリプトは続行します。

これを回避する方法はありますか?すべての変数の99%で何も悪いことが起こらないことを考えると、すべての変数を手動で型チェックする代わりに、このようにすればもっときれいになると思いました。

34
Marcos

解決策#1

ErrorException を使用して、エラーを例外に変換して処理します。

function exception_error_handler($errno, $errstr, $errfile, $errline ) {
    throw new ErrorException($errstr, $errno, 0, $errfile, $errline);
}
set_error_handler("exception_error_handler");

解決策2

try {
    // just an example
    $time      = 'wrong datatype';
    if (false === $timestamp = date("Y-m-d H:i:s", $time)) {
        throw new Exception('date error');
    }
} catch (Exception $e) {
    return false;
}
39
Federkun
try {
  // call a success/error/progress handler
} catch (\Throwable $e) { // For PHP 7
  // handle $e
} catch (\Exception $e) { // For PHP 5
  // handle $e
}
37
Nabi K.A.Z.

私が見つけた短いもの:

set_error_handler(function($errno, $errstr, $errfile, $errline ){
    throw new ErrorException($errstr, $errno, 0, $errfile, $errline);
});

すべてのエラーをキャッチ可能なErrorExceptionのインスタンスにします

7
Luca C.