2009-02-16 14 views
13

Yuvalanmış try-catch blokları alabilir miyim? Örneğin:Yuvalanmış try-catch blokları C++ 'da olabilir mi?


void f() 
{ 
    try 
    { 
     //Some code 
     try 
     { 
      //Some code 
     } 
     catch(ExceptionA a) 
     { 
      //Some specific exception handling 
     } 
     //Some code 
    } 
    catch(...) 
    { 
     //Some exception handling 
    } 
}//f 
+3

Sadece bu kişilerden daha akıllı olduklarını düşünen ve bu web sitesinin sahibi olduklarını düşündüklerini düşünen bu insanları sevmelisiniz –

+2

Genellikle bu tür soruları şüphe parasıyla veririm: sadece derleyiciniz üzerinde çalıştığı için bunun bir parçası olmadığı anlamına gelmez standardın Sohbet de doğrudur. – rmeador

+2

Shoho bu soruyu sormadan en az 90 saniye kurtardı! –

cevap

19

Evet tamamen yasal.

daha temiz görünüyor ve yöntem (ler) yani başka bir yöntem haline iç olanları taşımak iyi olurdu rağmen küçük

1

Evet, yapabilirsiniz.

7

Daha önce belirtildiği gibi bu mümkün, ama görmek zorunda 'başarısız olmayı Şunun içinde. İlk try-catch-blokta istisnasız yakalanırsa, dış catch-block tarafından yakalanmayacaktır. Bununla birlikte, iç yakalama bloğu tarafından yakalanmazsa, dış yakalama bloğunda eşleşen bir istisna işleyicisi bulmaya çalışacaktır.

Ayrıca explicitely iç istisna-işleyicisinde throw; kullanarak bir sonraki istisna işleyici için ayrıca özel durum oluşturabilir.

Örneğin bu kodu:

try 
{ 
    try 
    { 
     throw std::runtime_error("Test"); 
    } 
    catch (std::runtime_error& e) 
    { 
     std::cerr << "Inner Exception-Handler: " << e.what() << std::endl; 
     throw; 
    } 
} 
catch (std::exception& e) 
{ 
    std::cerr << "Outer Exception-Handler: " << e.what() << std::endl; 
}

Çıkacaksınız:

Inner Exception-Handler: Test 
Outer Exception-Handler: Test

Bu std::runtime_error is derived from std::exception çünkü çalışır. Ayrıca, önemsiz bir örnekte sadece birbirleri sonra yakalama blokları yazmak da mümkündür olduğuna dikkat etmelidir, ancak öncelikle catch-bloğundan sonra başka kod yürütmesine istiyorsanız yuva bunları gerekecektir.

1

Onun yasal ama onun tüm bu faydalı değil size iç yakalamak istisna atan sürece(). Örneğin, bir sistem düzeyi istisnası yakalamak isteyebilir, ancak kod açıklığı için kendi istisna nesnesini atabilirsiniz.

+3

Dış yakalama farklı bir dizi özel durumu ele alıyorsa yararlıdır – MSalters

5

Evet, bu yasaldır. ouster'un dediği gibi, bunun üstesinden gelmenin bir yolu, içteki try-catch bloğunu kendi işlevine koymak ve bu işlevi dış try-catch bloğunuzdan çağırmaktır.

idare bir başka yolu birden yakalamak bloklarla olduğunu.

void f() 
{ 
    try 
    { 
     //Some code that throws ExceptionA 
     //Some code that throws ExceptionB 
    } 
    catch(ExceptionA ea) 
    { 
     //Some exception handling 
    } 
    catch(ExceptionB eb) 
    { 
     //Some exception handling 
    } 
}//f 

şey buradan dikkatli olmaları gerektiği konusunda yakalamak bloklar halinde istisna tiplerinin spesifikliğidir. ExceptionB, yukarıdaki örnekte ExceptionA'yı genişletirse, ExceptionB bloğu asla çağrılmaz, çünkü ExceptionA bloğu tarafından atılan herhangi bir ExceptionB işlenir. İstisna sınıfı hiyerarşileri ile uğraşırken yakalama bloklarını en spesifikden en az belirli sıraya göre sipariş etmeniz gerekir.

İlgili konular