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の例外処理を入れたのですが、
例外処理されないようです。セグメンテーション違反に対して
例外処理をすることはできないのでしょうか。
できるとすれば、どのように記述をすればよいでしょうか。
No.1ベストアンサー
- 回答日時:
PHPプログラムレベルの例外ではなくて、PHP自体が異常終了してしまっているのだと思いますので、PHPプログラム内で捕まえることは不可能です。
他の言語では、スタックの不足を事前検知して、プログラム内で例外を上げるものもあるようですが、PHPはスタックの不足を事前検知せず、不足した時点でPHPがこけるという事でしょう。
ご回答ありがとうございます。
PHPがインタプリタ型の言語であり、逐次実行することを考えると、確かにどうしようもなさそうですね。
No.2
- 回答日時:
スクリプト言語である PHP の場合では、あまり興味ない話ですね。
> ※何回目でセグメンテーション違反が発生するかは、
その都度異なります。
そらそうでしょ、注目すべきはネストの深さでなく、食いつぶしてる容量。
変数増やせばもっと早く落ちる。
容量や実行時間のリミットってセットしてますか?
最悪の事態に備えて、わざわざリミットまで用意してくれている。なんて親切な言語なんだろう。(リミットに頼り切るのもどうかと思うけど)
ちなみに try/catch は throw された例外を捕まえるためのもので、オブジェクト指向信者(皮肉が過ぎるか)のために PHP5 から導入された。
スクリプト言語でどうなんだろうねぇって思うけどね。finally ないし。
古くは、エラー処理のため set_error_handler などなど用意してくれている。もちろん、メモリが食いつぶされた状態ではどうしようも無いけど。
global なんて書くコードもいい加減うんざりだ。
あまり興味のないお話しに付き合って頂き、ありがとうございます。
こちらで提示したプログラムは意図的にエラーを発生させるために書いたものであると考えて頂ければと思います。
No1さんの解答へのお礼でも書きましたが、どうしようもなさそうですね。set_error_handler関数を使っても同様でしょう。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
さくらのレンタルサーバーでメ...
-
開発現場でのPHPの書き方について
-
CGI(Perl)でできてPHPではで...
-
PHPのif文でその処理を途中で抜...
-
FTPコマンドでディレクトリごと...
-
onedrive にexcelファイルをア...
-
VBSの「MsgBox」について
-
ImageCreate関数が undefined f...
-
.phpと.incファイルの違いはな...
-
.phpファイルが、表示されない
-
Subversionのリポジトリの削除
-
FTPClientで転送結果(OKかFAIL)
-
【file_exists】ファイルが存在...
-
3つ以上の論理積は利用可能なの...
-
phpのエラー
-
ヒアドキュメントの中で演算子...
-
指定した期間の日付生成
-
リンク先を隠す方法はないでし...
-
パースエラーとは?
-
phpinfo.phpを開くとファイルの...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
= $argv[1];はどんな働きがあり...
-
smartyでホームページ上の画像...
-
さくらのレンタルサーバーでメ...
-
PHP3で作ったプログラムをPHP4...
-
さくらインターネットでImageMa...
-
eclipseのエラーの意味
-
photo.php?id=0001 このような...
-
掲示板を資料を参考にして開発...
-
MySQLのベースに書かれたプログ...
-
PHP関数で呼んだまま返って...
-
sqliteでのデータベースのlocal...
-
同じレス内に質問の キャッチボ...
-
PHPを利用してtelnet用のプログ...
-
PHPでのメール受信について
-
PHPからPerlにデータを渡して結...
-
XML-RPCでsend()できない
-
PHPで2地点間の緯度経度の求め...
-
コメント 中国語 日本語
-
CGI(Perl)でできてPHPではで...
-
PHPプログラムの内部からPOSTす...
おすすめ情報