std :: abort i std :: exit (i więcej: std :: _ Exit, std :: quick_exit) to tylko funkcje niższego poziomu. Używasz ich, aby powiedzieć programowi, co dokładnie chcesz, aby zrobił: jakie destruktory (i czy) ma wywołać, jakie inne funkcje czyszczące mają wywołać, jaką wartość zwrócić itp.
std :: terminate jest abstrakcją wyższego poziomu: jest wywoływana (przez środowisko wykonawcze lub przez ciebie) w celu wskazania, że wystąpił błąd w programie i że z jakiegoś powodu nie można go obsłużyć przez zgłoszenie wyjątku. Konieczność tego zwykle pojawia się, gdy błąd pojawia się w samym mechanizmie wyjątków, ale możesz go użyć w dowolnym momencie, gdy nie chcesz, aby program kontynuował pracę poza podanym błędem. Skompilowałem pełną listę sytuacji, w których std :: terminate jest wywoływane w moim poście. Nie jest określone, co robi std :: terminate, ponieważ masz nad nim kontrolę. Możesz skonfigurować zachowanie, rejestrując dowolne funkcje. Ograniczenia, które masz, są takie, że funkcja nie może wrócić do miejsca błędu i nie może wyjść przez wyjątek, ale technicznie możesz nawet uruchomić pompę wiadomości w środku. Aby zobaczyć listę przydatnych rzeczy, które możesz zrobić w środku, zobacz mój drugi wpis .
W szczególności zwróć uwagę, że std :: terminate jest uważane za procedurę obsługi wyjątków w kontekstach, w których std :: terminate jest wywoływana z powodu wyrzuconego wyjątku, którego nie można obsłużyć, i możesz sprawdzić, jaki był wyjątek i sprawdzić go za pomocą C ++ 11 przy użyciu std :: rethrow_exception i std :: current_exception. To wszystko jest w moim poście .