0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

PHP classの基本 例外処理について

Posted at

#例外処理について覚えていく

###例1)まずエラーを出す


<?php

class Entree
{
    public $name;
    public $ingredients = [];

    public function __construct($name, $ingredients)
    {
        if (!is_array($ingredients)) {
            throw new Exception('$ingredientsは配列を指定してください');
        }


        $this->name = $name;
        $this->ingredients = $ingredients;
    }


    public function hasIngredient($ingredient)
    {
        return in_array($ingredient, $this->ingredients);
    }
}

//ドリンクインスタンス
$drink = new Entree('1杯の牛乳','milk');
if($drink->hasIngredient('milk')){
    print 'うまい';
}

上記コードは

Fatal error: Uncaught Exception: $ingredientsは配列を指定してください in /Applications/MAMP/htdocs/test/class1.php:11
Stack trace:
#0 /Applications/MAMP/htdocs/test/class1.php(34): Entree->__construct('1\xE6\x9D\xAF\xE3\x81\xAE\xE7\x89\x9B\xE4\xB9\xB3', 'milk')
#1 {main}
  thrown in /Applications/MAMP/htdocs/test/class1.php on line 11

こういったエラーを出す。
原因はドリンクインスタンスの第二引数で配列を使用していない為。

この件については過去記事
PHP classについて(基本)コンストラクタ使い方 / staticを使用したメソッド呼び出し / selfの使用 / 例外処理について

PHP try{}catch, throw, Exceptionの考え方(基本)

にて説明。

こういったエラーに対応する為には
1. 例外を発行する可能性のあるコードをtryブロック内に入れる
2. 問題に対応する為に、例外を発行する可能性のあるコードの後ろにcatchブロックを使用する。

###修正例)



//ドリンクインスタンス
try{
    $drink = new Entree('1杯の牛乳','milk');
    if($drink->hasIngredient('milk')){
        print 'うまい';
    }
}catch(Exception $e){
 print "ドリンクは結果を表示出来ません。" .$e->getMessage();
}

結果
/*
ドリンクは結果を表示出来ません。$ingredientsは配列を指定してください
*/

ドリンクインスタンス部分を上記のようにtry{}catch(){}で囲む
するとエラーの結果が分かりやすいエラー文になる。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?