错误报告,知道它在代码中的位置

Error reporting knowing where it is in the code

本文关键字:代码 位置 报告 错误      更新时间:2023-10-16

我有一个名为"err"的流,它位于命名空间Errors中。这就是开发人员以用户友好的方式报告错误的方式。因此,当出现错误时,开发人员将编写这样的错误消息:

Errors::err << "Oh no. That was a bad thing.";

是否可以使用预处理器将[__FILE__:__LINE__]附加到错误消息中而不改变当前的错误报告样式?也就是说,上面的命令现在(在预处理魔法之后)将输出到一个错误文件:

哦,不。这是一件坏事。(file.cc: 20)

我自己也试过,但是C预处理器似乎不喜欢命名空间,我觉得我不能在代码中到处替换"err"-如果开发人员决定使用using Errors::errusing namespace Errors,这将是一个更大的问题。

在我想要实现的范围内,c预处理器是否与编码风格根本不兼容?如果是这样,是否有其他方法(也许基于Makefile ?)来做我想做的事情?

这在你当前的样式下是不可能的。在运行时调用的例程不知道是谁调用它们。但是,您可以使用特定于平台的函数获得反向跟踪,并将其写入。

如果你可以替换所有的错误报告代码,例如:

REPORT_ERROR( "Oh no. That was a bad thing." );

这很容易。你只需要#define

#define REPORT_ERROR(x) Errors::err << x << "[" << __FILE__ << ":" << __LINE__ << "]" << endl;

给你,我想这行得通。您应该注意,这样做可能是一个坏主意,因为这段代码往好了说很古怪,往坏了说完全错误或无效。我还没有真正深入测试或检查,但我知道它可以在我的系统(Windows 7/MSVC10)上编译和运行。如果我在产品代码中看到这样的东西,我可能会认为这是一种黑客行为,并且必须说服我。

#include <cstdlib>
#include <sstream>
#include <string>
#include <iostream>
using namespace std;
namespace Errors
{
    class errstream
    {
    public:
        errstream(const std::string& filename, int lineno) : file_(filename), line_(lineno) {};
        std::string dump() const;
        errstream& operator<<(const std::string& msg)
        {
            cout << msg << "t[" << file_ << ":" << line_ << "]";
            return * this;
        }
    private:
        std::string file_;
        int line_;
    };
};
 #define err errstream(__FILE__, __LINE__)
int main()
{
    Errors::err << "Oh no. That was a bad thing.";
}

输出是(对我来说):

哦,不。这是一件坏事。[main.cpp: 30]

编辑:ROUND 2

在下面的评论中,提出了一个新的要求。OP希望能够做这样的事情:

Errors::err << "File Not Found '" << file << "'  What A Bummer. :(";

…输出为:

文件未找到!"真倒霉。":(某某文件:

我的原始代码不会产生这个输出,因为它不能处理多个流插入,只有一个附加标记的位置。相反,输出变成了一团乱麻:

文件未找到![main.cpp:61] [main.cpp:61] [au:游手好闲的人。[main.cpp:61]

可以通过让errstream在调用析构函数而不是调用流插入操作符时将其内容转储到cout来实现。流插入操作符依次收集将在位置字符串之前转储到cout的令牌。新代码:

#include <cstdlib>
#include <sstream>
#include <string>
#include <iostream>
#include <iterator>
#include <vector>
using namespace std;
namespace Errors
{
    class errstream
    {
    public:
        errstream(const std::string& filename, int lineno) : file_(filename), line_(lineno) {};
        ~errstream()
        {
            std::copy(tokens_.begin(), tokens_.end(), ostream_iterator<string>(cout));
            cout << "t[" << file_ << ":" << line_ << "]n";
        }
        errstream& operator<<(const std::string& msg)
        {
            tokens_.push_back(msg);
            return *this;
        }
    private:
        typedef std::vector<std::string> Tokens;
        Tokens tokens_;
        std::string file_;
        int line_;
    };
};
 #define err errstream(__FILE__, __LINE__)
int main()
{
    Errors::err << "Oh no. That was a bad thing.";
    string file = "foo.txt";
    Errors::err << "File not found! '" << file << "' What a bummer. :(";
}

现在的输出是:

哦,不。这是一件坏事。[main.cpp: 38]

文件未找到!"真倒霉。"((main.cpp: 41)