プログラム内で処理中断後も継続処理を行うには?

このQ&Aのポイント
  • プログラム内で処理を中断した場合も、継続処理を行う方法について
  • 処理中断後も継続処理が必要な場合には、return文を使用する
  • 処理を中断せずに次の処理を継続するためには、return文を適切に使う必要がある
回答を見る
  • ベストアンサー

プログラム内で処理中断後も継続処理を行うには?

include を使って、次のふたつの処理を実行しようとしています。 include("a.php"); include("b.php"); $result_a=fun_a(1); $result_b=fun_b(2); さて、このとき、fun_a内で処理を中断した場合も、fun_bの処理も行わなければなりません。 fun_a内でexitを使用すると、それ以降のプログラムを実行しなくなったので、returnを使い ました。すると、fun_a内で処理を中断しても、fun_bの処理が行えました。 結果的に、よかったのですが、こうしたincludeしたプログラム内で、処理を中断した場合も、 以降のプログラムを引き続き処理する場合には、returnを使うものなのでしょうか?

  • PHP
  • 回答数3
  • ありがとう数3

質問者が選んだベストアンサー

  • ベストアンサー
  • t_ohta
  • ベストアンサー率38% (5085/13290)
回答No.1

処理全体を終了(exit)させるのはメインルーチンの仕事ですので、関数内でその関数の処理を終了させる場合はreturnで呼出元に処理を戻します。 関数内で何らかのエラーが発生して処理の実行が困難になった場合は、呼出元にエラーを知らせる戻り値を返してメインルーチン内で戻り値の判断を行って処理を終了させるか、関数内でExceptionを投げてメインルーチン内のエラー処理に事後の処理を委ねます。

dv8hjkwf
質問者

お礼

おっしゃるとおり、exitは、メインルーチン内で使うものですね。関数内では、戻り値を書き込み、メインルーチン内で判断することにしますね。

その他の回答 (2)

  • shimix
  • ベストアンサー率54% (865/1590)
回答No.3

関数はreturnで戻るのが基本です。 #exitで終わるくらいのケースなら、dieで止める方が多いと思います。 処理した結果どうだったか(ちゃんと処理できたかどうか)も含めて呼び出し元に返り値で戻します。returnを省略したらnullを返しますが、「何かあって中断した」のであれば、return false; などとして、あとで(必要があれば)見分けられるようにしておくべきです。

dv8hjkwf
質問者

お礼

ありがとうございました。return で、戻り値を入れて使うことにします。

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.2

>以降のプログラムを引き続き処理する場合には、returnを使うものなのでしょうか? フローを最後までまわしたくないなら、手っ取り早いのはreturnです exitは強制終了なので余程のことがない限りつかわないでしょう <?PHP @(1/0) or exit("error!"); ?>

dv8hjkwf
質問者

お礼

そうですね。exitは、なるべく使わないようにします。

関連するQ&A

  • 複数PHPプログラムのHTML埋め込みについて

    お世話になります。 1ページ内に複数のincludeタグを使ってphpプログラムを読み込んでおりますが、ある一つのincludeタグ以降から、結果がつられて表示されてしまいます。 つまり、【図A】の通り一つのページ内に5つのphpを埋め込んでいますが、いざ出力結果を見てみると、【図B】の通り002.php以降が全て002.phpの結果になってしまいます。 尚、5つの各phpは、ランダムで文字列を表示させるphpプログラムです。 【図A】 <html> <body> <? include(\"001.php\"); ?> <? include(\"002.php\"); ?> <? include(\"003.php\"); ?> <? include(\"004.php\"); ?> <? include(\"005.php\"); ?> </body> </html> 【図B】 <html> <body> 001.phpの結果 002.phpの結果 002.phpの結果 002.phpの結果 002.phpの結果 </body> </html> PHPにお詳しい方、是非ご教授頂けると大変助かります。 何卒宜しくお願い致します。

    • 締切済み
    • PHP
  • php include内のエラー処理

    あるphpのプログラムの中で、 「include('a.php');」 などというような形で「a.php」を実行させる場合に、 a.phpに構文エラーがあると、 全体の処理が停止してしまうと思います。 このような場合に、元プログラムを止めずに、 元プログラムの側で「a.php」内に構文エラーがあった事を把握し、 適当なエラー処理をすることは可能でしょうか? (例えば、本体プログラム側で 「a.phpにエラーがあるので動かせませんでした」 と表示させる) イメージとしては 「a.php」は、プラグイン的な位置づけで、状況により、 「b.php」「c.php」など様々なソースを読み込ませることを想定しています。 プラグインにエラーがあるせいで、 本体プログラムまで停止してしまうのを防ぎたいというのが趣旨です。

    • ベストアンサー
    • PHP
  • プログラムがうまく動作しない

    int型変数aとbにそれぞれ値を入力し、それらをかけた結果を出力するプログラムをつくりました。もし文字が入力されたら yarinaoshi と表示し再びaに値を入力するように指示します。しかしこのプログラムはデバグしても何のエラーもないのですが、実際に実行し文字を入力すると Microsoft C++ Debug Library というダイアログボックスが出てきて Abort, Retry, Ignore の三つのボタンがでてきます。どれを選んでも作業は止まってしまい、思ったような結果が得られません。一体どうすればいいのでしょうか?  以下がそのプログラムのソースコードです。 #include <stdio.h> #include <ctype.h> #include <stdlib.h> int kakezan(int a, int b); int main(void) { int dt= 1; int a, b; while(dt !=0){ printf("Int1:"); scanf("%d", &a); if(isalpha(a) != 0) { printf("yarinaoshi"); scanf("%d", &a); } printf("Int2:"); scanf("%d", &b); dt = kakezan(a, b); printf("Result:%d\n", dt); } return 0; } int kakezan(int a, int b) { int dt; return dt = a*b; }

  • include_onceで呼び出したPHPファイル

    PHPでサイトを組んでいるのですが、include_onceで以下のようにPHPの各ファイルを呼び出して実行しているのですがうまくいきません。 <?php //レンタルサーバーのcronを利用して、定期的に走らせるコードです。 include_once "example_a.php"; include_once "example_b.php"; include_once "example_c.php"; ?> 各ファイルは、RSSで読み込んだデータをMySQLに格納するプログラムです。 個別で各ファイルを実行すると正しい結果となりますが上記のようなプログラムでまとめて実行するとexample_a.phpは正しい結果となりますが、example_b.php、example_c.phpは正しく処理されません。 原因として考えられるものがあれば、教えていただきたいと思います。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • PHPで外部プログラムのバックグラウンド処理(Windows)

    よろしくお願いします。 PHPのバージョン4でWindowsです。 現在***.exeをsystem()で実行しています。 この***.exeの処理が長い時で、10分位かかってしまうので、バックグラウウンドで処理をしたいと考えています。 コマンドプロンプトで >start ***.exe ~ を実行したところ、うまいことバックグラウンドで処理できました。 しかし、system()で上記のコードを実行したら一瞬黒い画面が出るだけで***.exeが実行されませんでした。 なにがだめなのか全然見当もつきません… 実現できればどんな方法でもかまわないので、 次の方法も試しました。 1. a.phpでsystem(">b.php") b.phpを呼び出し b.phpでsystem(">***.exe")を実行 結果:***.exeは実行されるのですがバックグラウンドで処理されない。 2. コマンドプロンプトでIEを開いてa.phpにアクセス a.phpでjavascript window.openでb.phpをオープン b.phpでsystem(">***.exe")を実行 b.phpをwindow.closeで閉じる 処理は出来たのですが、a.phpが残ってしまう…(消せない、消し方がわからない) a.phpが消せればこの方法でもいいのですが… とにかく実現できればいいのですが… わかる方がいたら教えてくださいお願いします。

    • 締切済み
    • PHP
  • PHPの例外処理

    PHPの例外処理について教えてください function test() {   try{    $a = 10;    $b = 0;    $result = $a/$b;   }   catch(Exception $e){    //エラー処理   } } 上記でcatchが実行されるためにはどのようにすれば良いでしょうか?例えば if($b == 0) {   throw new Exception('例外'); } を「$result = $a/$b;」の前に書いておくなどすればcatchされるのはわかりますが、 想定されるすべての例外のthrow処理を記載するなんてことはしたくありません。 実行してエラーだったら自動的にthrowされる、なんていうことはPHPでは無理でしょうか?

    • ベストアンサー
    • PHP
  • なんで一瞬で処理が終わるの?

    時間を計測するプログラムを書いたのですが、何故か一瞬で処理が終わってしまいます。 #include <stdio.h> #include <time.h> int main(void){ int i,j,a,b=1; clock_t t; t=clock(); for(i=0;i<1000000000;i++){ for(j=0;j<10000000;j++){ a=b; } } printf("%.3f秒\n",(clock()-t)/1000.0); printf("%f %f",clock(),t); return 0; } 実行結果 0.000秒 0.000000 0.000000 なんで0なんでしょうか・・。

  • プログラムがバグっている箇所を教えて下さい(1)

    C++初心者です。 以下のソースコードでバグっていると思われる箇所を教えていただけるとありがたいです。 /* 02_LIFO.cpp * * int型整数を格納するスタックを、配列を用いて実現する(格納上限1000個) * */ #include <stdio.h> #include <stdlib.h> #include <string.h> #include "02_LIFO.h" /* スタック格納要素最大数実装 */ const int LIFO::m_maxSize = 1000 * sizeof(int); /* コンストラクタ */ LIFO::LIFO() { memset(m_stack, 0, m_maxSize); } /* デストラクタ */ LIFO::~LIFO() { /* nop */ } /* プッシュ */ int LIFO::LIFO_push_array(const int push_value) { if (m_stored > m_maxSize) { return EXIT_FAILURE; } else { m_stack[m_stored++] = push_value; return EXIT_SUCCESS; } } /* ポップ */ int LIFO::LIFO_pop_array(int *pop_value) { if (m_stored == 0) { return EXIT_FAILURE; } else { *pop_value = m_stack[m_stored--]; return EXIT_SUCCESS; } } /* 以下テスト用 */ static void Check(bool result, int line) { if (result == false) { /* 結果がおかしい処理の行をログ出力 */ printf("ERROR Line:%d\n", line); } } /* 正常系テスト */ static void TestNormal(void) { int result; LIFO stack; result = stack.LIFO_push_array(10); Check((result == EXIT_SUCCESS), __LINE__); result = stack.LIFO_push_array(20); Check((result == EXIT_SUCCESS), __LINE__); int val = 0; result = stack.LIFO_pop_array(&val); Check((result == EXIT_SUCCESS), __LINE__); Check((val == 20), __LINE__); result = stack.LIFO_pop_array(&val); Check((result == EXIT_SUCCESS), __LINE__); Check((val == 10), __LINE__); } /* 境界値テスト */ static void TestLimit(void) { int result; LIFO stack; /* 空の状態でPOP */ int val = 0; result = stack.LIFO_pop_array(&val); Check((result == EXIT_FAILURE), __LINE__); /* MAX値までPUSH */ for (int i = 0; i < 1000; i++) { result = stack.LIFO_push_array(10); Check((result == EXIT_SUCCESS), __LINE__); } /* MAX値を超えてPUSH */ result = stack.LIFO_push_array(10); Check((result == EXIT_FAILURE), __LINE__); } /* メイン関数 */ int main() { /* テスト */ printf("TestStart\n"); TestNormal(); TestLimit(); printf("TestEnd\n"); return 0; }

  • ls | sort を実行するプログラム

    以下のプログラムはls | sortを実行するプログラムなのですが、出力が2回ずつ出てしまい困っております。以下に実行結果も載せましたので参照ください。 #include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <sys/wait.h> #include <unistd.h> main(int argc,char **argv){ int a[2],b[2]; int cint,status; char n; pid_t pid1,pid2; if(pipe(a)==-1){ perror("pipe"); exit(EXIT_FAILURE); } if(pipe(b)==-1){ perror("pipe"); exit(EXIT_FAILURE); } if((pid1 = fork())==-1){ perror("fork"); exit(EXIT_FAILURE); } if((pid2 = fork())==-1){ perror("fork"); exit(EXIT_FAILURE); } //子1 else if(pid1==0){ close(a[0]); close(b[0]); close(b[1]); dup2(a[1],1); close(a[1]); execlp(argv[1],argv[1],(char *)0); } //子2 else if(pid2==0){ close(a[1]); close(b[0]); dup2(a[0],0); dup2(b[1],1); close(a[0]); close(b[1]); execlp(argv[2],argv[2],(char *)0); } //親 else { close(a[0]); close(a[1]); close(b[1]); wait(&status); while((read(b[0],&n,1))==1){ putchar(n); } close(a[0]); } exit(EXIT_SUCCESS); } /*実行結果 $ ./pipesort ls sort 2^31-1.c~ 2^31-1.c~ a*b.c~ a*b.c~ a-z.c a-z.c a-z.c~ a-z.c~ a-z1.c a-z1.c a-z1.c~ a-z1.c~ a.c a.c a.c~ a.c~ a.out a.out a.sp~ a.sp~ a10 a10 */ というように同じファイル名が二度ずつ出力されるのです。これを出力は一度ずつにしたいのですがどのようにすればよいですか?

  • 関数をまとめる

    関数をつくるときにどうまとめれば良いのでしょうか? 例えば下のようなプログラムがあったとします. #include<iostream> int add(int, int); int multi(int, int); int main(void) {    int a = 4;    int b = 3;    std::cout << add(a, b) << std::endl;    std::cout << multi(a, b) << std::endl; } int add(int a, int b) {    return a + b; } int multi(int a, int b) {    return a * b; } add関数は足し算の結果,multi関数は掛け算の結果を返します. やっている内容はかわらずわざわざ2つに分ける必要があるか?と思ってしまいます. 要は, int arithmetic_operations(int a, int b, int pattern) {    int result;    switch(pattern) {       case 1:          result = a + b;          break;       case 2:          result = a - b;          break;       case 3:          result = a * b;          break;       case 4:          if(0 == b) {             exit(1);          }          result = a / b;          break;       default:          break;    }    return result; } このような関数を用意してpattern変数で計算を制御するほうがまとまりがあると思います.ですが,いちいち中身を確認しながらプログラムを書く必要があるので可読性は低くなります. どちらがベターでしょうか?