2008-12-02 5 views
12

Należy zauważyć, że ta funkcja nie ma treści "{" i "}". Po prostu blok try/catch:Czy naprawdę możesz mieć funkcję/metodę bez ciała, ale tylko blok try/catch?

void func(void) 
try 
{ 
    ... 
} 
catch(...) 
{ 
    ... 
} 

Czy jest to celowo częścią C++, czy jest to rozszerzenie g ++?

Czy jest jakiś cel dla tego innego niż ominięcie 1 poziomu {}?

nigdy nie słyszał o tym, dopóki nie wpadł http://stupefydeveloper.blogspot.com/2008/10/c-function-try-catch-block.html

Odpowiedz

4

Tak, to jest standard. Funkcjonalne bloki try, tak jak je nazywają, nie mają większego znaczenia dla zwykłych funkcji, ale dla konstruktorów pozwalają wychwycić wyjątki wyrzucone na listę inicjatorów.

Należy zauważyć, że w przypadku konstruktora wyjątek zawsze będzie ponownie wyświetlony na końcu bloków catch.

9

Tak, to jest poprawne C++. Jednym z celów, jaki udało mi się znaleźć, jest przetłumaczenie wyjątków na wartości zwracane i kod tłumaczący wyjątki w wartościach zwracanych, oddzielonych od innego kodu w funkcji. Tak, możesz return x; z bloku catch, takiego jak ten, który pokazałeś (faktycznie dopiero niedawno to odkryłem). Ale prawdopodobnie użyłbym innego poziomu nawiasów klamrowych i umieściłem funkcję try/catch wewnątrz funkcji w tym przypadku. Będzie bardziej znany dla większości programistów C++.

Innym celem jest złapać wyjątki rzucane przez liście inicjatora konstruktora, który wykorzystuje podobną składnię:

struct f { 
    g member; 
    f() try { 
     // empty 
    } catch(...) { 
     std::cerr << "thrown from constructor of g"; 
    } 
}; 
+0

Te konstrukcje wyglądają dobrze !! ... – OscarRyz

Powiązane problemy