linux - Undtagelseshåndtering C ++

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg tager input over fra Windows/Linux-konsollen, således at adgangskoden, at brugertyperne forbliver skjulte, som det sker i næsten alle Linux-operativsystemer.
Hvordan skal jeg med glæde håndtere den undtagelse, der kastes af følgende uddrag?


#ifdef \_WIN32
HANDLE hStdin = GetStdHandle(STD\_INPUT\_HANDLE);
DWORD mode = 0;
GetConsoleMode(hStdin, &mode);
SetConsoleMode(hStdin, mode & (~ENABLE\_ECHO\_INPUT));

std::string sTempPass;
getline(cin, sTempPass);
SetConsoleMode(hStdin, mode);

#elif \_\_linux\_\_
termios oldt;
tcgetattr(STDIN\_FILENO, &oldt);
termios newt = oldt;
newt.c\_lflag &= ~ECHO;
tcsetattr(STDIN\_FILENO, TCSANOW, &newt);

std::string sTempPass;
getline(cin, sTempPass);
tcsetattr(STDIN\_FILENO, TCSANOW, &oldt);


Og hvad er de mulige scenarier, det ovenstående stykke kan kaste forskellige typer undtagelser, og er der nogen anden platform uafhængig måde at gøre dette på?

Bedste reference


Rollback-operationer, der kræves i tilfælde af undtagelser, gennemføres normalt ved at køre en destructor i C ++. I dit tilfælde kan du oprette en klasse, der gemmer den aktuelle tilstand, og genopretter den i dens destructor:


struct ConsoleMode {
    DWORD mode;
    HANDLE handle;
    ConsoleMode(const HANDLE h) : handle(h) {
        ::GetConsoleMode(handle, &mode);
    }
    ~ConsoleMode() {
        ::SetConsoleMode(handle, mode);
    }
}


Opkaldskoden konstruerer så simpelthen et objekt med automatisk lagringsvarighed og efterlader oprydning til automatisk stakafvikling:


HANDLE hStdin = GetStdHandle(STD\_INPUT\_HANDLE);
{
    ConsoleMode savedState(hStdin);
    ::SetConsoleMode(hStdin, savedState.mode & (~ENABLE\_ECHO\_INPUT));

    std::string sTempPass;
    getline(cin, sTempPass);

   // savedState goes out of scope and runs its destructor to restore state.
   // The destructor runs as part of stack unwinding in case of an exception as well.
}


Linux-implementeringen er analog, med de respektive systemopkald og medlemmer tilpasset passende.