-1

我正在尝试在我创建的当前没有错误检查的锻炼跟踪器程序中实现异常处理。我有一个Exlist处理链表一系列函数的类,我想在添加异常处理时添加一些重要的函数:

  • 将列表更新为文本文件
  • 按日期排序列表
  • 编辑锻炼(使用键搜索列表)
  • 删除锻炼(使用键搜索列表删除)
  • 添加锻炼

我将如何从类内的函数中抛出异常并将它们捕获 int main()。我知道在同一个块中处理简单的异常,但我似乎无法想出一个解决方案来解决这个问题。我的理想情况是

//in int main, when the user selects add
try
{
    WorkoutList.addEx();
} 
//other code...
//catch at end of loop and display error
catch(string error)
{
    cout << "Error in: addEx..." << error << endl;
}
4

1 回答 1

2

您应该创建一个继承自 Exception 的异常类。例如,如果你想在添加错误值时抛出它,你可以这样做:

#include <stdexcept>
class WrongValueException : public std::runtime_error
{
    public:
        WrongValueException(string mess): std::runtime_error(mess) {}
};

然后,在addEx()函数中,抛出它

//SomeCode
if(value.isWrong()){
    throw WrongValueException("Wrong Value");
} else {
    //add
}

并主要抓住它:

int main(){
    //SomeCode
    try
    {
         WorkoutList.addEx();
    } 
    //other code...
    //catch at end of loop and display error
    catch(WrongValueException const& ex)
    {
        std::cerr << "WrongValueException: " << ex.what() << std::endl;
    }
    catch(std::exception const& ex)
    {
        std::cerr << "std::exception: " << ex.what() << std::endl;
        throw;
    }
    catch(...)
    {
        std::cerr << "Unknown Exception: " << ex.what() << std::endl;
        throw;
    }

抛出的异常会从你抛出的任何地方冒泡,直到它被捕获。如果它没有被捕获,程序将完成(可能不会展开堆栈(因此即使您重新抛出,最好总是在 main 中捕获异常(强制堆栈展开))。

于 2012-12-12T22:33:58.133 回答