21721


**現状**

[code]

    try {
      switch ($test) {
        case 1:
          break;
        case 2:
          throw new RuntimeException('');
        case 3:
          throw new RuntimeException('');
        default:
          throw new RuntimeException('');
      }
    } catch (RuntimeException $e) {
    }
    
[/code]

* * *

**やりたいこと**  
・2の時、try～catchを抜けたい  
・試してみたけど、うまくいかないコード

[code]

    try {
      switch () {
        case 1:
          break;
        case 2:
          $hoge = FALSE;
          break 2;
        case 3:
          throw new RuntimeException('');
        default:
          throw new RuntimeException('');
      }
    } catch (RuntimeException $e) {
    }
    //ココへ飛ばしたい
    
[/code]

* * *

もしくは、下記みたいなことは出来ないでしょうか？

[code]

    try {
      switch () {
        case 1:
          break;
        case 2:
          $hoge = FALSE;
          throw new HogeException('');
        case 3:
          throw new RuntimeException('');
        default:
          throw new RuntimeException('');
      }
    } catch (RuntimeException $e) {
    } catch (HogeException $e) {
      //ここで2だけを捕捉したい
    }
    
[/code]


CC BY-SA 3.0
2016-02-04T15:29:57.117
21714
2016-02-05T00:00:43.693
7886
question
php
try～catchの中のswitch文で、switchの上階層にあるtry～catch文を抜けたい


ほとんどご自分で解答を書かれているように思うのですが、HogeExceptionを定義してやるだけでいいのではないですか?

[code]

    class HogeException extends Exception {}
    
[/code]

このように限定された用途なら、goto文を使うのも有りだと思います。


CC BY-SA 3.0
2016-02-04T15:47:19.503
21715
2016-02-04T15:47:19.503
13972
21714
answer


`catch`句は記述された順序で評価されます。  
`HogeException`が`RuntimeException`を継承していたなら、先にcatch
RuntimeExceptionを書くとそちらに捕捉されてしまいます。  
そのような場合は記述の順序を変えてみてください。

[code]

    try {
      switch () {
        case 1:
          break;
        case 2:
          $hoge = FALSE;
          throw new HogeException('');
        case 3:
        default:
          throw new RuntimeException('');
      }
    } catch (HogeException $e) { // HogeException を先に捕捉する
    
    } catch (RuntimeException $e) {
    
    }
    
[/code]

参考：[例外処理の実装を把握する -
＠IT](http://www.atmarkit.co.jp/fcoding/articles/php5dev/01/php5dev01b.html)

>
> catch句は複数設定可能で、スクリプトの上から順に判定されていく。また、ある例外クラスのサブクラスは、継承関係にある親クラスが指定されたcatch句にも捕捉される。
>
>
> つまり上の例でいえば、発生した例外がTestExceptionであっても、Exceptionクラスを指定したcatch句にも捕捉されるということだ。そのため、catch句の順番をTestExceptionクラスとExceptionクラスとで逆にしてしまうと、例外TestExceptionは先に出てきたExceptionクラスが指定されたcatchブロックに捕捉されてしまい、TestExceptionを指定した2番目のcatchブロックは処理されなくなってしまう。


CC BY-SA 3.0
2016-02-05T00:00:43.693
21721
2016-02-05T00:00:43.693
10492
21714
answer