【最大10000ポイント】当たる!!質問投稿キャンペーン!

以下は 関数 hoge に失敗したら、例外を補足するコードです。

try {
  if (!hoge()) {
    throw new Exception('hogeに失敗しました');
  }
} catch (Exception $e) {
  echo $e;
}

以下のように書いたほうが分かりやすいと思いますが、
駄目なんでしょうか?

hoge() || die('hogeに失敗しました');


ちなみに、DBのトランザクションを利用して、何かに失敗したら、
catch 以下でロールバックするのは便利だと思います。
しかし、こういう場合以外で、try~catch構文を使うメリットは何でしょう?

このQ&Aに関連する最新のQ&A

A 回答 (4件)

set_error_handler, set_exception_handlerあたりでは?

この回答への補足

ありがとうございます。

この二つを、どのように使い分けていますか?
私は、set_error_handlerで統一したいのですが、それでもthrowしてcatchしてtrigger_errorするのが良策なんでしょうか?

補足日時:2008/03/05 23:05
    • good
    • 0

No2さんのおっしゃる通り、質問者さんのソースはPHP5~で動作します。


で、try-catchのメリットですが、例えば
・throwされる例外の種類によって、対処処理を変えることができる
・一連の処理の中で、エラーが発生する箇所がいくつかある場合に、tryで囲ってまとめることができる
・オブジェクト指向な書き方ができる
など、たくさんあるかと思います。

or die();の書き方だと、メッセージを表示して終了しかできませんよね。
手元で動かすような軽いスクリプトを作成するのであれば、そのような記述で良いかと思います(楽なので)が、それなりのプログラムを書く場合などは、プログラム内にor die();が数多くあると不恰好になります。

PHPはJavaのように多種の例外クラスが用意されていないので、例外クラスを自作して(FileIOExceptionとかDBExceptionなど)試してみると、そのメリットを感じやすくなると思います。

参考URL:http://jp.php.net/manual/ja/language.exceptions. …

この回答への補足

>or die();の書き方だと、メッセージを表示して終了しかできませんよね。

ANo.2の補足にも書きましたが、実は、or die を使いたい訳ではありません。or die も catch も trigger_errorも極力使わずに、エラーが発生したらエラーハンドラに渡したいのです。

なんとなく気づいているのですが、きっと、わたしが作ってる物の規模が小さいから、こういう発想になっちゃうでしょうね・・・。

補足日時:2008/02/23 03:52
    • good
    • 0

ん? 一応、PHPにもtry ~ catch構文はありますから、質問者さんの書かれたコードはすべてPHPとして間違いではないです。

ちゃんと機能しますよ。

が、これが動くのはPHP5からです。PHP5から、特にオブジェクト指向関係でかなりの強化が図られていることはご存知でしょう。tryも、よりオブジェクティブに例外処理行えるようにするために追加されたものといえます。

or die ~ってのは、昔の「関数」を中心とした構造化の考え方ですよね。エラーが起きたらこっちを実行する、と。けれどtryによる例外処理は、エラーの発生を「例外オブジェクトの発生」という形でとらえたものです。考え方がまったく異なるのです。だから、or dieは旧来のやり方、try catchはPHP5によるオブジェクト指向にそったやり方、といってもいいんじゃないかと。

or dieだと、その直前の関数についてのみエラー処理をすることしかできませんね。例えば、ネットワークだのファイルアクセスだのになると、複数の関数が異なる例外を発生させる可能性もあります。こうしたときに、例外が発生する処理全体を一つのtryでまとめ、それぞれの例外の内容に応じて対応できるtry catchは、慣れてくるとかなり快適ですよ。(こっちがもともとJavaグラマだからってのもあるけど)

この回答への補足

Javaプログラマなら、or die ~に嫌悪感を感じるのは仕方ないかもしれません。

実は私も同じです。メインルーチンを or die で汚したくありません。
かといって、throw が連発し、try、catchが幾重にもネストするのもどうかと思うのです。
ただ実際には、throw するのはクラスの中でやるんですよね?

ただここで疑問があります。PHPなら、or die としなくても、エラーが発生したら、自作のエラーハンドラで任意の処理をすることができるようです。
この場合、「エラーの発生」でなく「例外オブジェクト」の発生なら、エラーではないので、エラーハンドラに渡せません。
無理矢理やるなら、catch の中で、trigger_errorしてやらないといけないですよね?
これって何か無駄なような気がします。

根本的な考え方が間違っているのでしょうか?

補足日時:2008/02/23 03:38
    • good
    • 0

なんかPerlとJavaがごっちゃになっちゃっているようですが、その辺の理解は大丈夫ですか?



上記はJavaのコードで、下記はPerlのコードです。
以下のように書いたほうが分かりやすいと言う前に、Javaでは通常下記のコードは動きません。例外の実装が違うからです。
try~catch構文を使うメリットは数え上げられないですが、わかりやすい例では、
IOExceptionなら○○の処理をする
NetworkExceptionなら○○の処理をする
と例外の種類によって処理を変えることが出来るし、書き方によっては、エラー処理を一カ所にまとめて記述できるため、視認性が上がる。
などが有ります。

実際にそのようなコードを書いて、体験しないと有用性が解りづらいかと思いますが。

この回答への補足

> と例外の種類によって処理を変えることが出来るし

} catch (IOException $e) {
  処理;
} catch (NetworkException $e) {
  処理;
}

のようにできるということでしょうか?


> 実際にそのようなコードを書いて、体験しないと有用性が解りづらいかと思いますが。

実際に以下のように使用しております。

} catch (DBException $e) {
  $dbh->rollBack();
  die($e->getMessage());
}

DBを扱ってる際に、何かしらエラーを補足した場合にロールバックするという場合に、このtry~catch構文は非常に嬉しいです。
ですが、エラーを補足した場合に単に、エラーを出力して終わるだけの場合に、try~catch構文を使用するメリットが分からないのです。

補足日時:2008/02/23 03:21
    • good
    • 0

このQ&Aに関連する人気のQ&A

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

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qsyntax error, unexpected '}' というエラーの対処法

PHPを習い始めて三日目になるのですがParse error: syntax error, unexpected '}' in C:\Program Files\Apache Group\Apache2\htdocs\****\****\game.php on line 33
というエラーがでるのですが33行目前後のどこをなおせばいいのでしょうか?
・game.php
<html>
<head>
<title>数当てゲーム</title>
</head>
<body>
<h1 style="background:#cccccc">数当てゲーム</h1>
<form method="POST" action="game.php">
1~100までの数を入力してください
<input type="text" name="answer" size="5" maxlength="3" />
<input type="sbumit" value=回答" />
</form>
<hr />
<?php
session_start();
if(is_null($_SESSION['answer'])){
mt_stand(microtime()*1000000);
$_SESSION['answer']=mt_rand(1,100);
$_SESSION['game_cnt']=0;
}
if($_POST['answer']!=""){
$_SESSION['game_cnt']++;
if($_session['answer']==$_POST['answer']){
print("おめでとうございます".
$_SESSION['game_cnt']."回で正解しました!");
session_destroy();
}else{
if($_SESSION['answer']>$_POST['answer']){
print("もう少し大きいです。");
}else
print("もう少し小さいです。");
}
}
}
?>
</body>
</html>
それとこの間違えたところをなおしたあとはいつもコンピュータを再起動しないと修正したところが適用されないのですがほかに方法はないですか?基本的な質問ですいません。

PHPを習い始めて三日目になるのですがParse error: syntax error, unexpected '}' in C:\Program Files\Apache Group\Apache2\htdocs\****\****\game.php on line 33
というエラーがでるのですが33行目前後のどこをなおせばいいのでしょうか?
・game.php
<html>
<head>
<title>数当てゲーム</title>
</head>
<body>
<h1 style="background:#cccccc">数当てゲーム</h1>
<form method="POST" action="game.php">
1~100までの数を入力してください
<input type="text" name="answer" size="5" max...続きを読む

Aベストアンサー

print("もう少し大きいです。");
}else
print("もう少し小さいです。");
のelseの後に{がないようですが、大丈夫でしょうか?

Qtry~catchの使用方法

プログラミング超初心者です。
現在、C++やjavaの勉強をしているのですが、
・try~catchとはなんぞや
・どんな処理をするときにtry~catchをつけなければいけないのか
がよくわかっていないので、教えていただけないでしょうか?
また、そういったことが載っているサイトも併せて教えていただければうれしいです。

Aベストアンサー

これは、「例外処理」のためのものです。
動きとしては、
try { ... } の中で発生した「例外」に対する処理を、 catch { ... } の中に記述しますということになります。
これは、例外(おおざっぱに言えば、内部的なエラー)の「発見」と「発生」と、「リカバリ」に関わる分離の思想から考えられたものです。

例外処理がない場合、エラーの処理は、
・エラーが発生してないかどうか確認する
・エラーが発生していたら、その場で処理する
ということになります。

この方法には、問題がああって、本来の処理とエラー処理が混在して処理の見通しが悪くなるということになります。
例えば、以前の(失敗したら NULL を返す仕様の new 演算子の場合)

classA a = new classA(1, 0);
if (a == 0)
goto エラー処理;
classA b = new classA(1, 1);
if (b == 0)
goto エラー処理;
など。
これに対して、最近の(失敗したら、bad_alloc 例外をスルーする ) new だと、

try
{
classA a = new classA(1, 0);
classA b = new classA(1, 1);
}
catch(bad_alloc) // これは、new で失敗した時に投げられる例外
{
エラー処理
}

となります。
こうすれば、if (a == 0) が本来の処理ではなく、エラーチェックだったのがわかります。

また、往々にして、エラーの検出箇所(それがエラーだったとわかる場所)と、エラーの発生場所(エラーを発生させてしまった場所)は違うものです。

例えば、平方根を算出する関数はマイナスの引数を受け付けません。このため、普通は関数の中で引数がマイナスでないかどうかチェックをします。
おかしな引数を渡していれば、関数の中で引数がおかしいかどうかわかります。
しかし、この間数の中では、なぜ引数がおかしいのかはわかりません。
入力ミスなのか、計算ミスなのか。

一方で、引数がおかしくなった原因は、この間数を呼び出す箇所(の近く)にあることが多いわけです。
ですから、おかしな引数のリカバリは、こちら(発生場所)で行う方が妥当です。

もちろん、関数を呼び出す前にあらかじめ引数の妥当性をチェックするというのも正しい考え方です。
ただ、場合によっては、通常処理の流れでプログラムを作り、その処理の中で(この部分を try で囲む)エラーが検出された箇所(実際には、例外処理がスルーされる場所)の情報をもとに、エラーのリカバリ(ここが、catch セクション)を行うという形にするとすっきりする場合があります。

これは、「例外処理」のためのものです。
動きとしては、
try { ... } の中で発生した「例外」に対する処理を、 catch { ... } の中に記述しますということになります。
これは、例外(おおざっぱに言えば、内部的なエラー)の「発見」と「発生」と、「リカバリ」に関わる分離の思想から考えられたものです。

例外処理がない場合、エラーの処理は、
・エラーが発生してないかどうか確認する
・エラーが発生していたら、その場で処理する
ということになります。

この方法には、問題がああって、本来の...続きを読む

Qillegal string offset

php5.3では動いていたプログラムをphp 5.4 で動かしたらwarning illegal string offsetが出て困っています。以下のプログラムでwarningが出ないようにするにはどのようにコーディングすればよいのでしょうか?


$a = array('exists' => 'foo');
if ($a['exists']['non_existent']) {
print 1;
}
print 2;
exit;

Aベストアンサー

isset()を使えばいいと思います

QPHPのif文でその処理を途中で抜けるにはどうすればよいでしょうか?

PHPのif文でその処理を途中で抜けるにはどうすればよいでしょうか?
for文やwhile文ではbreakやcontinueなどが使えるようですが、if文にはないのでしょうか?

条件分岐がいくつかあって、その一つを途中で抜けて次の条件分岐へと移行したいのですが、
exitを使ってしまうと、次へ行かずに処理が中止されてしまいますし、
どのようにすればよいのか分からず困っています。何かよい方法はないでしょうか?

Aベストアンサー

例えば「goto 演算子」を使うとかですね。
http://php.net/manual/ja/control-structures.goto.php
(参考URL)

「if文を強制終了」というより「ステップの強制移動」と言った感じです。

ただ、あまりgoto演算子はお勧めできません。
複雑な処理になればなるほど、バグが発生した際にバグ元を発見し難くなります。

本来は細かく制御文を入れていけば、あまり必要ないと思いますが・・・

Qリンクをクリックした時にformからPOST送信したい。

HTML、PHP、JavaScript等でサイトを作っているのですが・・・。

【実現出来ている例】
<form name="form1" method="post" action="Next.php" onSubmit="return InputCheck()">
 <input type="submit" value="送信">
</form>
 submitボタンを一つ置いて、それがクリックされた場合に
formの内容をPOSTで送信する。

【実現したい例】
<form name="form1 method="post">
 <a href="Next.php" onClick="???">???</a>
</form>
 formの中のリンクをクリックされた場合に、formの内容を
POSTで送信したいのですが、その実現方法がわかりません。
GETで送るという手もあり得ますが、今回はどうしてもPOST
したいのですが。

Aベストアンサー

<form name="form1" method="post" action="Next.php">
<a href="#" onClick="document.form1.submit();">???</a>
</form>

onclick内の対象がform1としてあてているので、
アンカータグは別にform内に記述しなくても大丈夫です

form内にhidden等でnameとvalueを持ったパラメータがあればそれも送られます

アンカータグから動的にvalueを変更したい場合は、
document.form1.hogename.value = 'hoge';
等をsubmit()の前に行えば可能です

ただしform内に
<input type="hidden" name="hogename" value="">
を記述する等、変更先パラメータの元を用意する必要がありますのでご注意下さい

Q“try/catch”と“if/else”

プログラミング超初心者です。
以前、この掲示板でtry/catchとはどんなもので、どういう処理のときに使うものなのかという質問をさせていただいたのですが、そのときに

・if/elseは、ファイルが存在しないとか、ユーザーが許容範囲を越える文字列を入力したなどの『予測可能』な場合に使う
・try/catchは、データベースとの接続が途中で切断されるなどの『予測不可能』な場合に使う

ということを教えていただいたのですが、『予測可能』と『予測不可能』の境目がわかっていません。
そこで

・具体的に、この処理のときは普通はtry/catchを使う

というような処理を教えていただけないでしょうか?
また、そのようなことが記載されているサイトなんかも教えていただければうれしいです。

私が周囲の人から聞いたのは、「COM、またはRPCなどの通信系の処理にはtry/catchを使う」らしいのですが、根拠がいまいちよくわかっていません。
Googleなどで調べてみてもそれらしい答えがないもので・・・。

よろしくお願いいたします。

プログラミング超初心者です。
以前、この掲示板でtry/catchとはどんなもので、どういう処理のときに使うものなのかという質問をさせていただいたのですが、そのときに

・if/elseは、ファイルが存在しないとか、ユーザーが許容範囲を越える文字列を入力したなどの『予測可能』な場合に使う
・try/catchは、データベースとの接続が途中で切断されるなどの『予測不可能』な場合に使う

ということを教えていただいたのですが、『予測可能』と『予測不可能』の境目がわかっていません。
そこで

・具体的に...続きを読む

Aベストアンサー

条件判断である if() と、例外処理である try/chtch は本来全く別のものです。
それは、本質的な処理における「条件分岐」なのか、本質的な処理でない部分の「例外」なのかの差です。

ですから、具体的な事例というよりは、プログラム設計時の設計思想に関わってきます。

「ファイルが存在しない」というのを、
1)ファイル名を指定する
2)そのファイルが存在しているかどうかチェックする
3)ファイルが存在しない時には、ファイル名の再入力を求める
という場合は、「本質的な処理における分岐」

1)ファイル名を指定する
2)指定されたファイルからデータを読み込む
3)...
※ファイルが存在しない時には、あらかじめ設定されたファイルに差し替えること
であれば、「例外処理」

ただ、ひとついえるのは、「例外処理」は、(例外なだけに)、リカバリ処理を、通常の処理の流れの中に自然に埋め込むのは、かなり面倒です。

どちらかといえば、例外事項が発生した時に、リカバリ処理が、(あらかじめ設定されているデータに差し替えるなど)プログラム側である程度強引に処理できるものは、構造的に例外処理で組み立てる方が簡単ではあります。

これは、(例の中にも示してありますが)
・ファイルが存在しなかった時に、ファイル名の再入力を求める(もちろん、その後、通常の処理に復帰する)
・ファイルが存在しなかったら、あらかじめ設定されたデータを読み込んだことにしてしまう
の、それぞれを例外処理で組み立ててみると、構造的にどちらが例外処理になじみやすいかは、実感できると思います。

条件判断である if() と、例外処理である try/chtch は本来全く別のものです。
それは、本質的な処理における「条件分岐」なのか、本質的な処理でない部分の「例外」なのかの差です。

ですから、具体的な事例というよりは、プログラム設計時の設計思想に関わってきます。

「ファイルが存在しない」というのを、
1)ファイル名を指定する
2)そのファイルが存在しているかどうかチェックする
3)ファイルが存在しない時には、ファイル名の再入力を求める
という場合は、「本質的な処理における分岐」...続きを読む

QJavaScriptde途中で、「exit」するには?

function kensaku(){
s_data = document.kaiin_form.input_name.value;

if(!s_data){ alert("キーワードを入れて下さい!"); }

if(s_data != dumy){ ...... }
for(i=st_no;i<=n;i++){
......省略.................;
.......省略................}
}

----------------------------------
3行目で表示されたアラートをOKで閉じても、4行目以下が実行されてしまいます。
3行目でexitするにはどうすれば良いでしょうか?

Aベストアンサー

>関数(kensaku())からは抜けられませんでした。
そうですね、勘違いしていました、f(^^;
すみません。
if(!s_data){
alert("キーワードを入れて下さい!");
return;
}
ですね。

Q配列をPOSTで受けとる

タイトルのまんまですが
配列をformで送って
それをPOSTで受け取りたいのですが
うまくいきません

具体的に言うと
<?php
print"<form method=POST action=action.php>";

for($i=0; $i<$n; $i++){
   print"<input type=text name=foo[$i]>";
}
print"<input type=hidden name=n value=$n>";
print"<input type=submit value=go>";
print"<form>";
?>


///////////以下action.php//////////////////
<?php
$n = $_POST["n"];
for($j=0; $j<$n; $j++){
   $foo[$j] = $_POST["foo[$j]"];
   print"$foo[$j]";
}
?>


こんな感じのことがしたいのですが
うまくいきません
どうもPOSTされてないみたいでfoo[$j]はnullです
凡ミスな気がしなくもないんですが...プログラム初心者なんで↓↓
教えてください
よろしくお願いします

タイトルのまんまですが
配列をformで送って
それをPOSTで受け取りたいのですが
うまくいきません

具体的に言うと
<?php
print"<form method=POST action=action.php>";

for($i=0; $i<$n; $i++){
   print"<input type=text name=foo[$i]>";
}
print"<input type=hidden name=n value=$n>";
print"<input type=submit value=go>";
print"<form>";
?>


///////////以下action.php//////////////////
<?php
$n = $_POST["n"];
for($j=0; $j<$n; $j++){
   $foo[$j] = $_POST["foo[$j...続きを読む

Aベストアンサー

atsuGTさんこんにちは。


受け取り側は

$foo = $_POST["foo"];

とするだけで$fooに送信された配列が格納されます。


$_POST["foo[添え字]"] ではなく、
$_POST["foo"][添え字] となります。

Qテーブルの最後(最新)のレコードを抽出したい

宜しくお願いします。
PHP MYSQL の組み合わせで使っています

以下のようにして、最後のレコードを取り出したいのですが
まったく違う事をしているのかもしれません。

$sql =" select * from テーブル where フィールド='max' " ;

フィールドはauto_incrementで番号を振っています。
これで最大のつもりなのですが・・・。

他にも、レコードを入れた時間も記録したフィールドがあるのですが
どうしてよいか?判りません。

テーブルの最新のレコードを出したいのです。
**その中の一つのフィールドを取り出すのですが、
  それはうまくいっているみたいです 
  (max の所に数字を入れると表示します)

お手数かけますが、どなたかご教授お願いいたします。

Aベストアンサー

#2回答者です。

MySQL 4.1以前(サブクエリを使えない)なら、以下のような方法が考えられます。

select * from 表名
order by 列名 desc limit 1

QボタンをクリックでPHP文を実行

ボタンをクリックしたときのみPHP文を実行したいのですが・・・

<input type="button" onClink="<?php~?>">
でいけるかと思ったのですが、
ページ表示時に<?php~?>が実行されてしまい、うまくいきませんでした。

onClink="window.open(test.php)"
という方法以外でお願いします。

Aベストアンサー

AjaxはもともとJavaScriptの機能である非同期通信をつかったもので。Ajaxという言語があるわけではありません

Ajaxを利用するのであれば、JavaScriptのXMLHttpRequestを使って非同期通信できるような実装をしなくてはなりません
簡単にサンプルコードで書けるほど単純なものでもありません

一般的なサーバーサイドスクリプトの動作として、
ボタンを押す->サーバーへリクエストする->サーバーが処理する->クライアントに何かしらの結果を返す(出力する)です
つまり、PHP等のサーバーサイドスクリプトは、遷移させることが大前提で動作します

ですから、ボタンを押してその場でJavaScriptと同じようにPHPが動くなんてことはありえません。
ボタンを押したらサーバーにリクエストする という動作ならば可能です。

つまり
質問で言われているような
onClink="window.open(test.php)"

<form name="f1" action="test.php" method="post">
<input type="submit" name="submit" value="submit" />
</form>
等のような形になります

こういった一般的な方法だと いちいち画面が切り替わったようになってしまうのを嫌って Ajaxでコレと同じことを、画面を切り替えずに行っているだけに過ぎません

AjaxはもともとJavaScriptの機能である非同期通信をつかったもので。Ajaxという言語があるわけではありません

Ajaxを利用するのであれば、JavaScriptのXMLHttpRequestを使って非同期通信できるような実装をしなくてはなりません
簡単にサンプルコードで書けるほど単純なものでもありません

一般的なサーバーサイドスクリプトの動作として、
ボタンを押す->サーバーへリクエストする->サーバーが処理する->クライアントに何かしらの結果を返す(出力する)です
つまり、PHP等のサーバーサイドスクリプトは、...続きを読む


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング