Bu PHP İstisna tarafından karıştı .. catch yuvalama deneyin

3 Cevap php

Ben şu kod ile karıştı:

class MyException extends Exception {}
class AnotherException extends MyException {}

class Foo {
  public function something() {
    print "throwing AnotherException\n";
    throw new AnotherException();
  }
  public function somethingElse() {
    print "throwing MyException\n";
    throw new MyException();
  }
}

$a = new Foo();

try {
  try {
    $a->something();    

  } catch(AnotherException $e) {
    print "caught AnotherException\n";
    $a->somethingElse();    
  } catch(MyException $e) {
    print "caught MyException\n";
  }
} catch(Exception $e) {
  print "caught Exception\n";
}

Ben çıkış için bu beklenir:

throwing AnotherException
caught AnotherException
throwing MyException
caught MyException

Ama bunun yerine bu çıkışları:

throwing AnotherException
caught AnotherException
throwing MyException
caught Exception

Bu catch (MyException $ e) "atlar" Herkes neden açıklayabilir misiniz?

Teşekkürler.

3 Cevap

Istisna işleyicileri kendi try'ın kapsam içinde kod tarafından gündeme durum yakalamak.

Için çağrı $a->somethingElse() atlanan istisna işleyicisi ilişkili try bloğu içinde meydana gelmez. Bu başka yakalamak tümce içinde gerçekleşir.

Fiziksel durum bu kodu kapak yapmak için yeterli değildir yükseltir satırının altında görünür çünkü.

Parantez girinti ve stil seçimi, bu daha az net, IMHO yapar. Önceki try bloğunun yakın ayracı onlar ilgisiz (iyi, kardeş) kapsamları olsa bile, bir sonraki yakalamak olarak aynı satırda görüntülenir.

Yorumunuzda bunun için yeterli alan yok çünkü. Bir if ... else döngüsü olarak try ... catch düşünün. Aşağıdaki istemem:

$a = 10;
if($a == 9)
    print "\$a == 9";
elseif($a == 10) {
    $a = 11;
    echo "now \$a == 11";
} elseif($a == 11) {
    echo "\$a == 11";
}

durum zaten ilk elseif tarafından karşılandı, çünkü son durum ("\ a == 11 $") yazdırmak. Aynı try ... catch ile geçerlidir. Koşul bir araya geldi ise, aynı kapsamda yeni koşullara aramaya devam etmez.

Emin değil bu cevap kabul ya da değil, ama cevabı burada ortaya olmuştur ne daha basit bir olup olmadığını. Her denemek için sadece TEK catch bloğu tetiklenebilir ve her zaman uygulanabilir en özel biri olacaktır.

Bu durumda, AnotherException atılır ve iç try / catch ilk catch bloğu tarafından ele, bu yüzden ikinci catch bloğu tarafından ele olmayacaktır. Yeni istisna catch bloğu olsun en dış try / catch tarafından ele atılmış.