try - catch nie działa?

try - catch nie działa?
Blackhole
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 81
0

Hej!
Mam fragment kodu:

Kopiuj
	//--- przeniesienie do pracy w tle
	int pid = fork();
	if (pid<0) {
		blad << "Error: child process not created!" << endl;
		SaveLog("E: Couldn't move to background");
		f_background = true;
		exit(-12);		// fork error
	}
	else if (pid>0) {
		SaveLog(txt2string("--> Exiting parent process.  Child's (background) PID: ").append(int2string(pid)));
		exit(3);			// parent exits
		SaveLog(" ... Parent after 'fork'");		// chyba to nie zadziała
	}
	//else => pid=0 => jestem w procesie 'child'

//--- odtąd jest najważniejsze 
	SaveLog(" ... Child after 'fork'");
	try {
		LoadNet();
	} catch (...) {
		SaveLog("E: LoadNet failed!");
	}
	SaveLog(" ... Child after 'LoadNet'");

Tworzę sobie proces child i wywołuję z niego procedurę LoadNet. Mimo, iż jest ona w bloku TRY...CATCH, to w logu zapisuje się jedynie:

... Child after 'fork'

W LoadNet nie mam żadnego exit. Wygląda więc, że w niej wyskakuje jakiś wyjątek. Nie rozumiem tylko, dlaczego mój 'catch' go nie wychwytuje.
Co tu jest źle?

_13th_Dragon
  • Rejestracja: dni
  • Ostatnio: dni
2

jeżeli masz mazanie po pamięci to C++ nie łapię tego w wyjątkach

BG
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 293
0

Tak jak robisz to Twój child ginie razem z rodzicem.
Poczytaj o "double fork()", setsid(), ewentualnie sięgnij do źródła:

https://www.amazon.com/dp/0201433079/

Blackhole
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 81
0
_13th_Dragon napisał(a):

jeżeli masz mazanie po pamięci to C++ nie łapię tego w wyjątkach

Znalazłem powód. W funkcji stosowanej w LoadNet odwoływałem się do niezainicjowanej tablicy.
Nie wiem tylko, dlaczego catch tego wyjątku nie łapie. Jakieś wyjaśnienie i sugestia, co zrobić, aby wszystkie wyjątki można była wyłapać?

hauleth
  • Rejestracja: dni
  • Ostatnio: dni
4

Bo to nie wyjątek tylko błąd naruszenia pamięci, system wtedy wysyła sygnał do takiego procesu i dany proces popełnia harakiri. Możesz spróbować to obsłużyć przez sigaction (na Linuksach), ale to jest bardzo BARDZO niebezpieczne i wcale nie naprawi działania programu.

MarekR22
  • Rejestracja: dni
  • Ostatnio: dni
2

Offtopic:

Blackhole napisał(a):
Kopiuj
		exit(3);			// parent exits
		SaveLog(" ... Parent after 'fork'");		// chyba to nie zadziała

polecam doczytać dokumentację std::exit to wtedy się wyjaśni czemu SaveLog wydaje się nie działać.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.