質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

1回答

202閲覧

try,catch文はクラスファイル、もしくは呼び出し側、どちらに書くべきか

toll_tree

総合スコア199

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

1クリップ

投稿2019/04/25 01:41

編集2019/04/25 01:44

try,catch文をどちらに書いた方が良いか、といった点でお聞きしたいことがございます
以下のコードは、クラスファイルのtest_class.phpになります。

php

1 2<?php 3class test 4{ 5 6 private $dbh; 7 8 public function __construct($dsn,$user,$password){ 9 $dbh = new PDO($dsn,$user,$password); 10 $dbh->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); 11 $dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES,false); 12 $this->dbh = $dbh; 13 } 14 15 public function test($name,$password){ 16 try{ 17 $stmt = $dbh->prepare("INSERT INTO data(name,password)VALUES(:name,:password"); 18 $stmt->bindValue(':name',$name,PDO::PARAM_STR); 19 $stmt->bindeValue(':passwrod',$password,PDO::PARAM_STR); 20 $stmt->execute(); 21 }catch(PDOException $e){ 22 echo $e->getMessage(); 23 } 24 25 } 26}

以下は、test.phpになります。

php

1<?php 2$test = new test('mysql:host=localhost;dbname=test','root',''); 3$name = $_POST['name']; 4$password = $_POST['password']; 5try{ 6 $shop->test($nama,$password); 7}catch(PDOException $e){ 8 echo $e->getMessage(); 9}

上記2つのファイルにおきまして、クラスファイルに、try,catch文を書いた方が良いか、それとも呼び出し側に書くべきか、迷っております。
どちらに書いた方が良いか、ご助言頂ければ幸いです

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

エラーが発生した場合をキャッチしたいところにつけてください

投稿2019/04/25 01:47

yambejp

総合スコア114843

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

toll_tree

2019/04/25 02:06

ご回答ありがとうございます。 ご質問に掲示しました、クラスファイル、メソッド呼び出し側のファイルどちらに、try,catch文を記載したとしても、PDOExceptionエラーが発生した場合の挙動は、同じになるのでしょうか?
yambejp

2019/04/25 02:12

エラーになった箇所がtryで囲まれていればエラーをthrowしてもらえますし そうでないなら無視されるだけです
toll_tree

2019/04/25 02:18

つまり、呼び出し側、クラス側、どちらに記載してもエラーが発生すれば、$e->getMessage()の内容が出力されるということでしょうか?
退会済みユーザー

退会済みユーザー

2019/04/25 02:39

程度問題だと思うけど、try~catchの中に大量にデータベースアクセス処理を突っ込んで、いざ例外が発生したときに問題箇所が特定できれば広く捉えてもいいし、ラクに捉えるには狭く囲ってなんどもtry~catchブロックを置いて例外発生箇所を捉えやすくするのもよし。王道なし。
toll_tree

2019/04/25 02:47

>m6uさん 補足ありがとうございます。そうでしたか。自分は、王道のような方法があるのかと、思っていたのですが、そうではないということなんですね。
yambejp

2019/04/25 02:51 編集

逆に運用面ではエラーなんてユーザーは見えないほうがよいので エラーが発生したら「ごめんなさい、管理者に連絡してね」ページに飛ぶなど を記載することになります。 エラーでメッセージを出しているうちはデバッグ環境もしくは個人用(自社用)のレベルです。 デバッグ中はなんでもかんでもtry-catchして構わないので怪しい箇所は一通り 囲むのが王道じゃないですかね? 最近のphpはアサーションが強化されていますので運用前試験はもっと違う アプローチもありでしょう
toll_tree

2019/04/25 03:54

そうなんですね。となりますと、実際に運用する際には、try,catch文などは、コードから取っ払ってしまうような感じでしょうか?
yambejp

2019/04/25 04:15

ちゃんと読んでください 別ページに飛ばすしてエラー表示させないようにするということです
toll_tree

2019/04/25 05:02 編集

なるほど...エラーが起こった時専用のページを用意するということなんですね...
yambejp

2019/04/25 05:11

質問者さんが意識していないだけで403,404,500など エラーを返すページはサーバー側に用意されています。 またこれも前述しましたエラーを返さないという選択肢もあります
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問