虽然现在有许多成熟的日志工具可供选用,但是自己编写一个日志类可以让你用得更加得心应手。对于抛出异常的处理,C++语言本身并没有做什么东西,可怜的STL也只有一个很简单的异常类,所以下面先给出一个最简单的Exception类。
Exception.h
#ifndef _EXCEPTION_H_
#define _EXCEPTION_H_
#include <string>
class Exception
{
std::string msg;
public:
Exception(const char *msg)
{
this->msg = msg;
}
const char *getMessage()
{
return msg.c_str();
}
};
#endif
在接下来的Debug类中需要用到该Exception类。
Debug.h
#ifndef _DEBUG_H_
#define _DEBUG_H_
#include <stdio.h>
#include <string>
#include <iostream>
#include <sstream>
#include <fstream>
#include <Exception.h>
class Debug
{
static bool enabled;
public:
static void on()
{
enabled = true;
}
static void off()
{
enabled = false;
}
static bool isOn()
{
return enabled;
}
static void message(const char *s)
{
if (enabled == true)
printf("[message] %s\n", s);
}
static void message(std::string &s)
{
message(s.c_str());
}
static void message(std::ostringstream &s)
{
message(s.str().c_str());
}
static void message(const char *s, const char *fname)
{
if (enabled == true) {
std::fstream fout(fname, std::ios::out|std::ios::app);
if (fout.fail())
return;
fout << "[message] " << s << std::endl;
fout.close();
}
}
static void warning(const char *s)
{
printf("[warning] %s\n", s);
}
static void warning(std::string &s)
{
warning(s.c_str());
}
static void warning(std::ostringstream &s)
{
warning(s.str().c_str());
}
static void warning(Exception &e)
{
warning(e.getMessage());
}
static void warning(const char *s, const char *fname)
{
std::fstream fout(fname, std::ios::out|std::ios::app);
if (fout.fail())
return;
fout << "[warning] " << s << std::endl;
fout.close();
}
};
#endif
剩下的实现就剩下给静态变量赋初始值了。
Debug.cpp
#include <Debug.h>
bool Debug::enabled = false;