はじめに
こんにちは、エンジニアのkeitaMaxです。
前回、コードゴルフ大会のために、コードの正当性を判定する処理を作成しました。しかし、コードがエラーになると500エラーが発生し、任意のレスポンスを返すことができず困ってしまいました。これを備忘録として記事にまとめます。
前回の記事
前回のコード
function codeExecutionOutput($code){
ob_start();
eval($code);
$output = ob_get_clean();
return $output;
}
こんな感じで同じファイル内に関数として置いて、関数を呼び出すというような実装をしていました。
だめだったこと
単純にtry catchで囲えばいいかなと思って、関数を呼び出しているところを以下のように囲んでみました。
try {
self::codeExecutionOutput($code);
} catch (Exception $e) {}
これだけではcatchに入っていくれないで500エラーになってしまいました。
結論
コードチェック用の別のコンテナを立てて、そちらのAPIを叩くことで対応しました。
もしevalでエラーになってしまっても、フロント側に返すレスポンスはAPIサーバ側で操作できます。
ついでに別コンテナになったことでセキュリティ面も向上した?のでよかったかなと思います。
おわりに
この記事での質問や、間違っている、もっといい方法があるといったご意見などありましたらご指摘していただけると幸いです。
最後まで読んでいただきありがとうございました!