2014-12-18 20 views
0

在我的项目中,我设置了一个错误处理系统,但在我编写代码之前,我设置了一个测试项目以建立一个基础。我有我需要的一切,除了一件事情,那就是error.ToMessage()函数。问题是,我不知道如何以我建造它的方式来设置函数,并且找不到示例。使用枚举的错误处理

这里是我的代码:

#include <iostrea> 

enum class ErrorCode { 
    StreamError, 
    FileError, 
    CloseError 
}; 

int main() { 

    try { 
     throw ErrorCode::StreamError 
    } catch (ErrorCode err) { 
     //std::cout << err.ToMessage() << std::endl; //This is how I would like to output the error. 
     switch (err) { 
     case ErrorCode::StreamError: 
      std::cout << "Stream Error"; //This is how it's currently done. 
     //... 
     } 
    } 
} 

我怎么能做到这一点,如果这是可能的吗?

+0

创建类ErrorCode(应该从std :: exception继承),而不是枚举。 – poxip

+0

请参阅[本参考资料](http://www.cplusplus.com/doc/tutorial/exceptions/),您可以在标准例外下看到Ed S在答案中所陈述的内容。 –

回答

1

这是除了所有其他的答案,它建议创建自己的异常类(继承std::exception,这是一个普遍推荐的做法)。

如果你不想一直这样下去,考虑制定独立的(全球)功能:

enum class ErrorCode { 
    StreamError, 
    FileError, 
    CloseError 
}; 

std::string ToMessage(ErrorCode e) 
{ 
    switch (err) { 
    case ErrorCode::StreamError: return "Stream Error"; 
    case ... 
    default: ... 
    } 
} 

可以使用函数内的任何实现:一个switch声明,一个LUT或std::map

+0

这不是一个好主意,因为基于标准异常的代码不会知道任何关于'ToMessage'的信息。 –

2

您需要超过enum来完成此操作。你可以做的是创建你自己的异常类型,从std::exception继承。这个类将有一个ErrorCode成员(用于你的枚举)以及一个what()方法,该方法返回一个string(已在那里为你在std::exception)。

1

你不得不做出这样的处理异常的一类,把这个类中的所有交换机的情况下,将生成的字符串是所有的异常逮住

1

标准库的解决方案是std::system_error类,它是从std::runtime_error派生而来的,它是从顶级异常类派生的std::exception

std::exception::what可用于获取异常消息。

如果您发现标准类别不适合您的用途,请从std::runtime_errorstd::system_error中派生一个类别。

-1
#include <iostream> 

#define enum_name(a) #a 

enum test_enum 
{ 
    LOL, 
    OKAY, 
    NOPE, 
    YOU, 
    ARE, 
    SEXY 
}; 

int main() 
{ 
    auto test = test_enum::SEXY; 
    std::cout << enum_name(test); 
    return 0; 
} 
+1

没有解释 – anatolyg