2015-07-02 72 views
0

我想解析一个简单的文本文件并根据它所包含的数据创建一个对象。我为此使用C++ 11(而且我不流利)。将文本文件解析为对象时的错误处理

在任何类型的错误的情况下(例如缺少文件或无效的文本),我想告诉我的解析函数的调用什么地方出了错,提供喜欢什么样的错误发生,并且其中的文件信息。

我不认为例外,虽然解析出现错误,因此它似乎异常不是要走的路。

我认为在成功的情况下返回struct的所有信息,包括所产生的分析对象:

struct ParsingResult 
{ 
    bool success; 
    int errorCode; 
    int errorLine; 
    ParsedObject object; 
} 

但是我没有这个解决方案说服,因为在错误的情况下,我必须仍然提供ParsedObject。当然,我可以为它定义一个默认的构造函数,但仅当解析成功时,ParsedObject才有意义。

我可以将ParsedObject更改为ParsedObject*,但是我不愿意在不需要的时候使用指针,我不知道这是否可以避免。

我的问题:你能提出更好的解决这个问题呢?它是什么?

回答

1
struct Obj 
{ 
    // your object from the data... 
} 

struct ParseError 
{ 
    int errorCode; 
    int errorLine; 
} 

class Parser 
{ 
    ParseError m_error; 

    // other things 
public: 
    bool parse(const std::string& filename, Obj& parsedObject) 
    { 
     // Open file, etc... 
     //parsedObject.property1 = some_value; 

     // if something is wrong, set m_error and return false; 
     // return true if ok 
    } 

    ParseError getLastError() { return m_error; } 
} 


// in your code 
Parser p; 
Obj o; 
if(!p.parse("filename", o)) 
{ 
    // ParseError = p.getLastError(); 
} 
1

您可以使用

unique_ptr<ParsedObject> 

shared_ptr<ParsedObject> 

,其默认的构造函数可以解析失败的情况下,被比作空。

避免原始指针将释放您不必释放内存:)