2010-04-26 13 views
9

Używam gcc na Linuksie do kompilowania kodu C++. Istnieje kilka wyjątków, które nie powinny być obsługiwane i powinny zamknąć program. Jednakże chciałbym być w stanie wyświetlić ciąg wyjątek:Środowisko wykonawcze C++, komunikat wyjątku wyświetlania

na przykład:

throw std::runtime_error(" message"); nie wyświetla komunikat, tylko rodzaj błędu. Chciałbym również wyświetlać wiadomości. Czy można to zrobić?

to biblioteka, naprawdę nie chcę umieszczać instrukcji catch i pozwolić użytkownikowi biblioteki decydować. Jednak obecnie użytkownik biblioteki to fortran, który nie pozwala na obsługę wyjątków. w zasadzie mogę umieścić procedury obsługi w kodzie owijarki, ale raczej nie, czy istnieje sposób wokół

+0

'throw std :: runtime_error (" message ");' wyświetla teraz wiadomość na g ++ 6.2.0, Ubuntu 16.10. –

Odpowiedz

12

standardowe wyjątki mają wirtualny what() metodę, która daje komunikat skojarzony z wyjątkiem:

int main() { 
    try { 
     // your stuff 
    } 
    catch(const std::exception & ex) { 
     cerr << ex.what() << endl; 
    } 
} 
+0

Dodałem wyjaśnienia dotyczące moich wymagań. – Anycorn

+3

@aaa Jeśli twój kod jest przeznaczony do użycia z kodu spoza C++, to powinien mieć podany link C i nigdy nie powinien zezwalać na wyjątki, aby uciec do kodu wywołującego. –

+0

jaki jest dobry sposób na przekazanie problemów z terminalem do programu głównego? Potrzebuję jakiegoś obiektu, aby wydrukować ciąg znaków błędu, bez polegania na wyjściu fortranu. – Anycorn

6

można napisać w głównym:

try{ 

}catch(const std::exception &e){ 
    std::cerr << e.what() << std::endl; 
    throw; 
} 
+0

Dodałem trochę wyjaśnień. Zasadniczo mogę pójść z czymś takim, jeśli nie da się tego obejść. – Anycorn

+0

Należy zauważyć, że ma to tę wadę, że zdmuchnięcie twojego stwora wywołania, które g ++ normalnie zachowałoby w pliku rdzenia dla niezakłóconych wyjątków. –

2

można użyć try/catch bloku i throw; oświadczenie pozwolić użytkownikowi biblioteki do obsługi wyjątku. Instrukcja throw; przekazuje kontrolę do innego modułu obsługi dla tego samego wyjątku.

+0

OK, myślę, że umieszczę próbę złapać z nadrukiem wiadomości w opakowaniach fortran/c i wyrzucę stamtąd. wtedy pozwolę sobie samodzielnie obsługiwać wyjątki dla interfejsu C++ – Anycorn

1

Zalecam wykonanie adaptera do biblioteki dla dzwoniących z fortranu. Umieść próbkę/catch w adapterze. Zasadniczo twoja biblioteka potrzebuje wielu punktów wejścia, jeśli chcesz, aby był wywoływany z Fortran (lub C), ale nadal zezwalaj na wyjątki, aby móc się do nich odwoływać. W ten sposób ma również tę zaletę, że daje połączenie C++ z wywołującymi C++. Tylko posiadanie interfejsu fortranowego ograniczy cię znacząco, ponieważ wszystko musi być przekazane przez odniesienie, musisz podać ukryte parametry dla argumentów char * itd.

Powiązane problemy