80871


以下はある教材の「例外処理」に関するコードのサンプルです。  
Post.php と main.php の2つのファイルを使っています。  
ここでPostクラスのコンストラクタ内の

[code]

    if (strlen($text) <= 3){
        throw new Exception('テキストは3文字以上にしてください');
         }
    
[/code]

この部分なのですが、

[code]

    if (strlen($text) <= 3){
      echo 'テキストは3文字以上にしてください';
    }
    
[/code]

としても表示結果は同じです。

ここではmain.phpに２つのインスタンスがあります。

[code]

    $posts[0] = new Post('hi');
    $posts[1] = new Post('Good evening');
    
[/code]

この場合$posts[0]の方は('hi')と記述してあるので、文字数は２つなので

[code]

    if (strlen($text) <= 3){}
    
[/code]

この条件にひっかかり、メッセージ「テキストは3文字以上にしてください」  
と表示されるのはわかりますが。  
が、２つめの$posts[1]の'Good evening'は問題なく表示されてもおかしくないと思います。が、echo で記述しても、throw new
Exceptional()でメッセージを記述しても  
全く同じ内容です。

何のためにthrowを使って例外を投げ、インスタンスをはじめmain.phpをtryで囲み  
catchで受け、getMessageで文字を表示されるのかよくわかりません。

ここでいう例外処理の例外とは

[code]

    if (strlen($text) <= 3)
    
[/code]

の条件に合わなかった場合のことを言っているのでしょうか？  
例外処理の「例外」という言葉の意味と、throw, Exception, try などを何のために使うのか理解できません。  
条件の3文字以上の文字列'Good evening'も一緒に表示されない意味もわかりません。  
なぜ表示結果が

[code]

    テキストは3文字以上にしてください
    Good evening
    
[/code]

とならず条件に合わない方の「テキストは3文字…」のみが表示されるのでしょうか？  
初心者で今回はじめて例外処理というものに挑みました。  
例外処理の例外という意味、また例外処理として何のために try,Exception,catchなどを使うのかも理解できませんん。

他にどういうところで使い道があるのかも想像できません。  
初心者過ぎて恐縮ですが、この辺りを簡潔に説明していただけないでしょうか？  
よろしくお願いいたします。

**< Post.php>**

[code]

    <?php
    
    class Post
    {
      private $text;
    
      function __construct($text){
    
        if (strlen($text) <= 3){
    
       　　throw new Exception('テキストは3文字以上にしてください');
        }
          $this->text = $text;
      }
    
      function show(){
        printf('%s',$this->text);
      }
    }
    ?>
    
[/code]

**< main.php>**

[code]

    <?php
    require('Post.php');
    
    try{
    
    $posts[0] = new Post('hi');
    $posts[1] = new Post('Good evening');
    
    foreach($posts as $post){
      $post->show();
      echo "<br>";
    }
    } catch(Exception $e){
      echo $e->getMessage();
    }
    ?>
    
[/code]

**< 表示結果>**

[code]

    テキストは3文字以上にしてください
    
[/code]


CC BY-SA 4.0
2021-08-17T07:58:32.813
80869
2021-08-18T01:13:00.560
42150
question
php
例外処理の「例外」の意味や用途がよくわかりません。教えてください。


一般的に、プログラムは上から下に実行されて行きます。  
条件分岐(if文など)やループ(foreachなど)では、順序が上から下でない部分が出てきますが、  
プログラムのコードを見れば、どのような順序で実行が進むのか理解できます。

例外というのは、実行が行われている途中で実行に支障がある動作（例えば、メモリに存在しないアドレスへのアクセス）が発生して、プログラムに書かれているとおりの順序で実行できなくなる事態の事です。  
例外が起きると、プログラムの実行はそこで中断して、発生した例外へ対処することになります。  
ファイルを開く動作が、その名前のファイルが存在しない(例外の発生)ために中断する。  
そこで例えば、以下のような例外への処理をするようにプログラムを用意します。（catch節に記載します）

  1. そこでプログラムの実行をあきらめる。
  2. ファイル名を入れなおして、存在するファイルを開く。
  3. あらかじめ用意しておいたファイルを開く。

質問のコードだと、

[code]

    $posts[0] = new Post('hi');　// ここで例外が発生する。
                                 // 正常な実行は、中断。例外処理に移る
    
    
    $posts[1] = new Post('Good evening');
    
[/code]

というように実行されるので、$posts[1] = new Post('Good evening');が実行されることが無いのです。


CC BY-SA 4.0
2021-08-17T11:06:28.937
80871
2021-08-17T11:06:28.937
217
80869
answer


以下の様に記述した場合、メッセージを出した後に `xxxxx` が実行されてしまいます。

[code]

    if (strlen($text) <= 3){
        echo 'テキストは3文字以上にしてください';
    }
    xxxxx
    
[/code]

textの長さが3以下の場合はプログラムの実行をしたくない場合、xxxxxの処理をスキップする必要があります。このためにはxxxxxをif文のelseに書く必要があります。

このようにいろいろなチェックが増えてくると、if文のネストが深くなりますので、  
エラーの場合一気にどこかに飛ばしたいと思うようになります。  
これが例外処理です。例外処理ではthrowするとその下の文は実行されずcatchの場所に飛んできます。


CC BY-SA 4.0
2021-08-18T01:04:38.593
80880
2021-08-18T01:13:00.560
2021-08-18T01:13:00.560
3060
24490
80869
answer