将文本文件解析为对象时的错误处理

Error handling when parsing text file to object

本文关键字:错误 处理 对象 文本 文件      更新时间:2023-10-16

我想解析一个简单的文本文件,并根据它所包含的数据创建一个对象。我使用的是C++11(我不太流利(。

如果出现任何类型的错误(例如丢失文件或无效文本(,我希望告诉解析函数的调用方出了什么问题,并提供诸如发生了什么类型的错误以及文件中的位置等信息。

我不认为在解析时会出现异常,所以似乎不应该出现异常。

我想返回一个包含所有信息的struct,包括在成功的情况下解析的对象:

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

然而,我不相信这个解决方案,因为在出现错误的情况下,我仍然必须提供ParsedObject。当然,我可以为此定义一个默认构造函数,但从本质上讲,ParsedObject只有在解析成功时才有意义。

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

我的问题是:你能为这个问题提出一个更好的解决方案吗?它是什么?

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();
}

您可以使用

unique_ptr<ParsedObject>

shared_ptr<ParsedObject>

在解析失败的情况下,可以将其默认构造函数与null进行比较。

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