2012-01-03 12 views

risposta

15

No, non ci sono aspetti negativi. Questo è il modo in cui dovresti farlo.

4

È un modo perfettamente valido per codificare.

#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

In realtà, c'è anche una tecnica interessante per l'utilizzo di try/catch-blocchi annidati: si supponga di avere molteplici funzioni che devono effettivamente la stessa gestione delle eccezioni. Soprattutto quando si esegue il wrapping di un'altra interfaccia, questo è uno scenario comune. In questo caso è possibile raggiungere tutte le eccezioni, chiamare una funzione dal gestore di eccezioni, e in questa funzione rigenerare l'eccezione per implementare la gestione delle eccezioni attuale:

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(); } } 

Adoro evitando duplicare [non banale] codice!

+0

wait, puoi davvero "buttare" da una funzione annidata? Non ho mai visto una cosa del genere! –

+1

@MooingDuck: finché hai chiamato la funzione da un catch-block, puoi rilanciare l'eccezione. Ciò che è ancora più interessante è che funziona anche in Java e C# (ho usato questa tecnica originariamente in Java per gestire un numero enorme di diverse eccezioni del database: ero l'esperto C++ e non l'esperto Java, però) –

+0

I'll devi guardare nello standard e imparare i dettagli e gli angoli. –