异常处理C++
Exception Handling C++
我正在从Windows/Linux控制台接管输入,以便用户键入的密码保持隐藏状态,因为它在几乎所有Linux操作系统中都会发生。我应该如何优雅地处理以下代码片段引发的异常?
#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);
上面的代码片段可能会引发不同类型的异常,是否有任何其他独立于平台的方法可以做到这一点?
发生异常时所需的回滚操作通常通过在 C++ 中运行析构函数来实现。在这种情况下,您可以创建一个存储当前状态的类,并在其析构函数中还原它:
struct ConsoleMode {
DWORD mode;
HANDLE handle;
ConsoleMode(const HANDLE h) : handle(h) {
::GetConsoleMode(handle, &mode);
}
~ConsoleMode() {
::SetConsoleMode(handle, mode);
}
}
然后,调用代码只是构造一个具有自动存储持续时间的对象,并将清理留给自动堆栈展开:
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 实现是类似的,相应地调整了相应的系统调用和成员。
相关文章:
- 为什么我应该在异常处理中使用std::cerr而不是std::cout
- 当我使用 C++ 中的 C# dll 来使用 Selenium 时,存在异常处理问题
- Firebase C++VS2018 SDL2-在Firebase::app::create(..)上执行异常处理
- 使用 stoi 功能进行异常处理
- 子系统中的异常处理:本机
- 与异常处理程序中的操作员<<不匹配
- 数组 C++ 上的异常处理程序
- 异常处理:如果用户输入不是三个特定字符之一
- C++ 异常处理错误输出
- 视觉 std::矢量无异常:警告 C4530:使用了C++异常处理程序,但未启用展开语义.指定 /EHsc
- C++交换机状态异常处理
- 在字符串类上的成员函数和out_of_range异常处理
- 奇怪的消息 (_Base_bitset::_M_do_to_ulong) 从溢出异常处理程序中打印出来
- 执行视觉工作室异常处理模式
- 为什么隐式转换在异常处理中从派生到基?
- C++执行期间的类成员函数错误/异常处理
- C++ 中未处理的异常处理程序
- 用户定义的异常处理
- C :ScopeGuard vs返回支票和异常处理
- 异常处理期间的类型解析