错误报告,知道它在代码中的位置
Error reporting knowing where it is in the code
我有一个名为"err"的流,它位于命名空间Errors中。这就是开发人员以用户友好的方式报告错误的方式。因此,当出现错误时,开发人员将编写这样的错误消息:
Errors::err << "Oh no. That was a bad thing.";
是否可以使用预处理器将[__FILE__:__LINE__]
附加到错误消息中而不改变当前的错误报告样式?也就是说,上面的命令现在(在预处理魔法之后)将输出到一个错误文件:
哦,不。这是一件坏事。(file.cc: 20)
我自己也试过,但是C预处理器似乎不喜欢命名空间,我觉得我不能在代码中到处替换"err"-如果开发人员决定使用using Errors::err
或using 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)
- 如何使用 lldb 查找我的代码运行的位置
- 在C++代码中搜索对象的实例化位置
- 我应该在服务模板中的什么位置添加自己的代码?
- 在 C 代码中调用 Python 函数时第三次出现访问冲突写入位置错误
- 当光标位置在编辑控件 MFC 中更改时是否有通知代码?
- C++11 中的随机数:有没有一种简单的方法可以将生成器种子放在代码的一个位置,然后在不同的函数中使用它?
- cv:内存位置的异常 - 运行 openCV 代码 Visual Studio 2013 & Visual Studio 2017 - Windows 7
- 我如何在代码中找到(和删除)需要管理员特权的位置
- 如何跟踪通过外部代码修改类变量的所有位置
- 了解现代OpenGL中的代码绘图.OBJ并设置不同的位置
- Microsoft C++异常runtime_error在内存位置(代码 0x75A818A2)
- 给定代码段中引用的时间和空间位置的所有出现
- 当我在Xcode上访问矩阵(openCV垫子)的位置时,为什么我会得到未定义的行为(exc_bad_access(代码=
- 8谜题代码.我的队列没有填充,我找不到错误的位置
- 在C++中,为什么代码示例在重载运算符时经常使用内存位置
- 是否可以从代码中获取依赖库的位置
- 如何在C++中获取代码片段的位置
- G -FPIC不产生位置独立代码
- 如何在G 代码中找到给定的成员函数或CTOR的所有位置
- 调试__do_global_dtors_aux以查找代码位置