2012-01-03 15 views

cevap

15

Hayır, downsides yok. Yapman gereken yol budur.

4

Kodun tam olarak geçerli bir yolu var.

#include <iostream> 
using namespace std; 



int main(int argc, char* argv[]) 
{ 
     try  //outer try{} 
     { 
       try //inner try{} 
       { 
        throw std::runtime_error("Demo"); 
       } 
       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; 
     } 

    return 0; 
} 
17

Aslında, iç içe deneme/yakalama-blokları kullanmak için bile ilginç bir tekniği var: etkili aynı durum işleme gerek çoklu işlevlere sahip varsayalım. Özellikle başka bir arayüzün sarılması durumunda bu yaygın bir senaryodur. durumda, tüm özel durumları yakalamak istisna işleyicisi bir işlev çağırmak ve bu işlevin gerçek istisna işleme uygulamak için istisnayı yeniden atması mümkündür:

void fancy_handler() { 
    try { 
     throw; // assumes that fancy_handler() is called from catch-clause 
    } catch (std::runtime_error const& rt) { 
     std::cout << "runtime-error: " << ex.what() << "\n"; 
    } catch (std::exception const& ex) { 
     std::cout << "excption: " << ex.what() << "\n"; 
    } catch (...) { 
     std::cout << "unknown exception\n"; 
    } 
} 

void foo() { try { do_foo(); } catch (...) { fancy_handler(); } } 
void bar() { try { do_bar(); } catch (...) { fancy_handler(); } } 

Sadece çoğaltmak kaçınarak seviyorum [önemsiz olmayan] kod!

+0

bekleyin, yuvalanmış bir işlevden gerçekten atar mısınız? Hiç böyle bir şey görmedim! –

+1

@MooingDuck: işlevi bir catch bloğundan çağırdığınız sürece, istisnayı yeniden yapabilirsiniz. Daha da ilginç olan şey, bu aynı zamanda Java ve C# 'da da çalışmaktadır. (Java'da bu tekniği orijinal olarak çok sayıda farklı veritabanı istisnalarıyla uğraşmak için kullandım; C++ uzmanı değil, Java uzmanıydım;) –

+0

standart bakmak ve ayrıntıları ve köşeleri öğrenmek zorunda. –