Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

exec()の実行成否をtry catchで判断するのは…やめようね!

More than 3 years have passed since last update.
try{
    exec('Something_command',$output);
} catch (Exception $e) {
    echo 'コマンドの実行に失敗しました。';
}

と言った処理があったのですが、この書き方でcatchには入りません。

コマンドが失敗する余地がある場合や動的にコマンドを生成して実行する場合(動的にコマンドを生成するのはバグ臭プンプンですがそこはスルー)には以下のようにしてコマンドの失敗検知を行なう様にする。

exec('Something_command',$output, $return_var);
if($return_var !== 0){
    echo 'コマンドの実行に失敗しました。';
}

実行結果

コマンドの実行に失敗しました。

PHPのリファレンスを見ると

引数return_varが、引数 output と共に存在する場合、実行したコマンドの ステータスがこの変数に書かれます。

とあり、実行後の$return_varを見ることでコマンドが成功したか否かを判断することが出来ます。


別パターン

2>/dev/nullで標準エラー出力を捨てるパターン

if(!exec('Something_command 2>/dev/null',$output)){
    echo 'コマンドの実行に失敗しました。';
}

実行結果

コマンドの実行に失敗しました。

exec()の戻り値はコマンド結果の最終行を返します。
戻り値をそのまま評価対象にするのは実行するコマンドをだいぶ選びますので、用法を守って正しくお使い下さい。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away