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

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

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

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

Q&A

解決済

3回答

1394閲覧

PHPの例外処理でのメッセージには何を記述するべき?

退会済みユーザー

退会済みユーザー

総合スコア0

PHP

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

0グッド

2クリップ

投稿2018/03/23 15:05

編集2018/03/23 15:13

PHPで例外処理でのメーッセージはどの程度詳細に記述すればよいのでしょうか。
例えば以下のようにファイルをアップロードするクラス内で例外処理をした場合、例外をスローする各箇所のコードの行数なんかを投げてもいいのでしょうか?

PHP

1<?php 2 3namespace yuuhi\imgUploader; 4 5class Uploader{ 6 7 private $info; 8 9 private function fileCheck() 10 { 11 if (!isset($_FILES['upfile']['error']) || !is_int($_FILES['upfile']['error'])) { 12 throw new FileUploadException('yuuhi\imgUploader\Uploader::fileCheck() at line 12'); 13 } 14 15 switch ($_FILES['upfile']['error']) { 16 case UPLOAD_ERR_OK://アップロードOK 17 break; 18 case UPLOAD_ERR_NO_FILE://ファイルが選択されていない 19 throw new FileUploadException('yuuhi\imgUploader\Uploader::fileCheck() at line 19'); 20 case UPLOAD_ERR_INI_SIZE://php.iniのアップロード上限値を超過 21 throw new FileUploadException('yuuhi\imgUploader\Uploader::fileCheck() at line 21'); 22 case UPLOAD_ERR_FORM_SIZE://フォームでのアップロード上限値を超過(フォームにて上限値を設定していた場合) 23 throw new FileUploadException('yuuhi\imgUploader\Uploader::fileCheck() at line 23'); 24 default://その他のエラー 25 throw new FileUploadException('yuuhi\imgUploader\Uploader::fileCheck() at line 25'); 26 } 27 28 if (false === $this->info = @getimagesize($_FILES['upfile']['tmp_name'])) {//ファイルの情報取得 29 throw new FileUploadException('yuuhi\imgUploader\Uploader::fileCheck() at line 29');//ファイルの情報取得エラー 30 } 31 32 if (!in_array($this->info[2], [IMAGETYPE_GIF, IMAGETYPE_JPEG, IMAGETYPE_PNG], true)) {//拡張子チェック 33 throw new FileUploadException('yuuhi\imgUploader\Uploader::fileCheck() at line 33');//拡張子エラー 34 } 35 36 return; 37 } 38 39 public function upload(string $path = null,bool $duplication) 40 { 41 try { 42 43 $this->fileCheck(); 44 45 if ($duplication) { 46 //重複したデータを許す(重複しない値を生成するまでループ) 47 while(is_file($fileName = $path . '/' . bin2hex(openssl_random_pseudo_bytes(32)) . image_type_to_extension($this->info[2]))); 48 }else { 49 //一意なファイル名生成 50 $fileName = $path . '/' . sha1_file($_FILES['upfile']['tmp_name']) . image_type_to_extension($this->info[2]); 51 } 52 53 fopen($fileName, 'xb');//排他的にファイルを生成(既にファイルが存在している場合はWarningが発生する) 54 55 if (!move_uploaded_file($_FILES['upfile']['tmp_name'], $fileName)) {//作成したファイルを上書き(移動) 56 throw new FileUploadException('yuuhi\imgUploader\Uploader::upload() at line 56');//ファイルの移動失敗 57 } 58 59 chmod($fileName, 0644);//パーミッションを0644に設定 60 61 return [ 62 'status' => 'success', 63 'message' => 'Successfully uploaded the file.' 64 ]; 65 66 67 } catch (FileUploadException $e) { 68 return [ 69 'status' => 'error', 70 'message' => $e->getMessage() 71 ]; 72 } 73 } 74} 75

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

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

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

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

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

guest

回答3

0

例外をスローする各箇所のコードの行数なんかを投げてもいいのでしょうか?

正解はないので投げてもいいかと言われると投げてもいいという回答になりますが、あまりよろしくはないですね。
強いて言えば「//ファイルが選択されていない」等のコメントで書いている部分をメッセージに渡してあげた方がベターです。
理由は、そのクラスの利用者として例外が発生した場合、各箇所のコードの行数の情報から例外の発生原因をたどるよりも、ダイレクトに例外の発生原因を受け取ったほうが良いからです。

ちなみに例外の発生ファイルや行数はわざわざメッセージで渡さなくても取得できます。
http://php.net/manual/ja/exception.getfile.php
http://php.net/manual/ja/exception.getline.php

投稿2018/03/23 15:47

xenbeat

総合スコア4258

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

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

退会済みユーザー

退会済みユーザー

2018/03/24 13:42

>>そのクラスの利用者として例外が発生した場合、各箇所のコードの行数の情報から例外の発生原因をたどるよりも、ダイレクトに例外の発生原因を受け取ったほうが良いからです。 とても納得する理由ありがとうございます。
guest

0

ベストアンサー

例外は後から開発メンバが確認する際に原因がわかる程度の内容(メッセージ+起因する変数の中身、など)で大丈夫です。
例外の発生個所(ファイル名や行数)はExceptionから取得できますので、プログラムにハードコードする必要はありません。
また、原因がいくつもある(catchの際に切り分ける必要がある)場合は自身でException派生クラスを定義するのもよいかと思います。

http://php.net/manual/ja/class.exception.php

投稿2018/03/23 15:38

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2018/03/24 13:40

>>例外の発生個所(ファイル名や行数)はExceptionから取得できますので、プログラムにハードコードする必要はありません。 そうなのですね。ありがとうございます(*´ڡ`●)
guest

0

多分、スタックトレースを知らない、という事かな…?

投稿2018/03/24 00:02

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2018/03/24 13:42

すいません…。もっと勉強します(*´ڡ`●)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問