プロが教える店舗&オフィスのセキュリティ対策術

PHPのセグメンテーション違反に対する例外処理について

再帰呼び出しのプログラム(error_seg.php)を作成し、Linuxのシェルで
 $ php error_seg.php
と実行しました。

実行環境:
PHPのバージョン:5.2.10
Linuxのバージョン:2.6.18-164.15.1.el5 (mockbuild@builder16.centos.org) (gcc version 4.1.2 20080704 (Red Hat 4.1.2-46)) #1 SMP Wed Mar 17 11:37:14 EDT 2010

プログラムは下記の通りです。

<?php
$cnt=0;

function func(){
global $cnt;
$cnt++;
print $cnt . "回目の呼び出し\n";
func();
}

try{
func();
}catch(Exception $e){
echo "例外発生:" . $e->getMessage()."\n";
}
?>

※このプログラムは、
  http://d.hatena.ne.jp/syonbori_tech/20090414/123 …
 のサイトを参考にして作りました。

この結果、
 1回目の呼び出し
 2回目の呼び出し
 ・・・
 26187回目の呼び出し
 26188回目の呼び出し
 セグメンテーション違反です
と表示され、セグメンテーション違反を再現させました。

※何回目でセグメンテーション違反が発生するかは、
 その都度異なります。

プログラム中で、try-catchの例外処理を入れたのですが、
例外処理されないようです。セグメンテーション違反に対して
例外処理をすることはできないのでしょうか。
できるとすれば、どのように記述をすればよいでしょうか。

A 回答 (2件)

PHPプログラムレベルの例外ではなくて、PHP自体が異常終了してしまっているのだと思いますので、PHPプログラム内で捕まえることは不可能です。



他の言語では、スタックの不足を事前検知して、プログラム内で例外を上げるものもあるようですが、PHPはスタックの不足を事前検知せず、不足した時点でPHPがこけるという事でしょう。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

PHPがインタプリタ型の言語であり、逐次実行することを考えると、確かにどうしようもなさそうですね。

お礼日時:2010/08/12 14:17

スクリプト言語である PHP の場合では、あまり興味ない話ですね。



> ※何回目でセグメンテーション違反が発生するかは、
 その都度異なります。

そらそうでしょ、注目すべきはネストの深さでなく、食いつぶしてる容量。
変数増やせばもっと早く落ちる。

容量や実行時間のリミットってセットしてますか?
最悪の事態に備えて、わざわざリミットまで用意してくれている。なんて親切な言語なんだろう。(リミットに頼り切るのもどうかと思うけど)

ちなみに try/catch は throw された例外を捕まえるためのもので、オブジェクト指向信者(皮肉が過ぎるか)のために PHP5 から導入された。
スクリプト言語でどうなんだろうねぇって思うけどね。finally ないし。

古くは、エラー処理のため set_error_handler などなど用意してくれている。もちろん、メモリが食いつぶされた状態ではどうしようも無いけど。

global なんて書くコードもいい加減うんざりだ。
    • good
    • 0
この回答へのお礼

あまり興味のないお話しに付き合って頂き、ありがとうございます。

こちらで提示したプログラムは意図的にエラーを発生させるために書いたものであると考えて頂ければと思います。

No1さんの解答へのお礼でも書きましたが、どうしようもなさそうですね。set_error_handler関数を使っても同様でしょう。

お礼日時:2010/08/12 14:21

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!