2012-04-10 14 views
1

私はPHPのeval関数を使用しようとしています。 しかし、私は解析エラーを処理するには固執しています。私は、エラー解析与えた場合、私は1 ..または1 ++ のようなエッジケースを持っている場合、考慮のような は:構文エラーを、.....PHPでeval関数の解析エラーを処理する方法

誰もが構文エラーを処理する方法や、エラーメッセージを回避する方法を知っていますか? より良いエラーメッセージを出したい。

変数にエラーメッセージを格納することもできますか? manualから

TIA

+2

なぜ地獄あなたは明らかにあなたによって書かれていませんでしたコードに 'eval'を使用していますか? – ThiefMaster

+0

サーバ側でevalを使用するよりも、クライアント側でもより良い方法が必要です。 – Ryan

+0

これはプロジェクトの仕様であり、現実の目的では使用されません。 – ordinaryman09

答えて

2

If there is a parse error in the evaluated code, eval() returns FALSE and execution of the following code continues normally. It is not possible to catch a parse error in eval() using set_error_handler() .

しかし、あなたが任意のコードにevalを呼び出すことはありませんよう(?右)、これが問題になることはありません。 manual

As of PHP 7, if there is a parse error in the evaluated code, eval() throws a ParseError exception. Before PHP 7, in this case eval() returned FALSE and execution of the following code continued normally. It is not possible to catch a parse error in eval() using set_error_handler() .

から

+0

はい、preg_matchを使って検証しました。しかし、エラーメッセージを変更する方法はありますか? – ordinaryman09

+0

@ ordinaryman09: 'preg_match'を使って任意のPHPコード(AFAIK)を検証することはできません。あなたが「エッジケース」を持っているという事実は、それを実証しています。 –

+0

はい、完全ではないので、適切なエラーメッセージを表示するだけでエッジケースを処理する必要があります。 – ordinaryman09

10
$response = @eval($string); 
if (error_get_last()){ 
    echo 'Show your custom error message'; 
    //Or you can 
    print_r(error_get_last()); 
} 
+1

それを見つけようとした30分後にしか、私はこれを見つけ出しませんでしたが、実際にエラーをキャッチするのに役立ちました。私の防衛では、これは私のコードではなかった。私は他の誰かを修正していたし、彼らはスタイルの外に行っていたように評価を使用しました! – CWSpear

+1

'error_get_last()'は実際にはこのように動作しません。実際には、evalされた文字列の外であっても、すべてのスクリプトに全くエラーがない場合にのみnullを返します。 '@trigger_error( 'MY_LAST_ERROR');'のように自分自身を引き起こして最後のエラーを上書きし、 'error_get_last'で返された配列のメッセージが' 'MY_LAST_ERROR''であるかどうかを確認できます。現在 'set_error_handler'は' false'を返します。 – Ando

6

は、代わりにこれを使用する:

<?php 

try { 
    eval('will cause error'); 
} catch (ParseError $e) { 
    echo 'Caught exception: '.$e->getMessage()."\n"; 
} 
関連する問題