首页 > 代码库 > C++异常类的定义和使用以及我对异常类的理解
C++异常类的定义和使用以及我对异常类的理解
异常类的作用就是在执行我们自己的某个功能函数出现意外情况时,为了方便查找错误出处,可以在意外发生时抛出异常
(1).首先定义自己的异常类 可以直接定义也可以从标准异常类派生
class CEGUIEXPORT Exception
{
public:
virtual ~Exception(void);
const String& getMessage(void) const {return d_message;}
const String& getName() const { return d_name; }
const String& getFileName(void) const {return d_filename;}
const int getLine(void) const {return d_line;}
protected:
Exception(const String& message = "", const String& name ="CEGUI::Exception", const String& filename = "", int line = 0);
String d_message;
String d_filename;
String d_name;
int d_line;
};
//------------------------------------------------------------------------
Exception::Exception(const String& message, const String& name, const String& filename, int line)
: d_filename(filename), d_line(line), d_message(message), d_name(name)
{
// Log exception or send it to error stream (if logger not available)
Logger* logger = Logger::getSingletonPtr();
if (logger)
{
logger->logEvent(name + " in file " + filename + "(" + PropertyHelper::intToString(line) + ") : " + message, Errors);
}
else
{
std::cerr << name << " in file " << filename.c_str() << "(" << line << ") : " << message.c_str() << std::endl;
}
}
//------------------------------------------------------------------------
Exception::~Exception(void)
{
}
(2).派生出具体的异常类 此处就是不便归类的异常
class CEGUIEXPORT UnknownObjectException : public Exception
{
public:
UnknownObjectException(const String& message, const String& file = "unknown", int line = 0)
: Exception(message, "CEGUI::UnknownObjectException", file, line) {}
};
#define UnknownObjectException(message) \
UnknownObjectException(message, __FILE__, __LINE__)
(3).在具体的功能函数里,在可能出现异常的地方设置抛出异常
const Image& Imageset::getImage(const String& name) const
{
ImageRegistry::const_iterator pos = d_images.find(name);
if (pos == d_images.end()) //这里可能会因为找不到图形文件造成意外 为了处理这种意外可以在此处抛出异常
{
throw UnknownObjectException("The Image named ‘" + name + "‘ could not be found in Imageset ‘" + d_name + "‘."); //抛出异常时会创建一个异常类对象,就会执行异常类的构造函数,从而执行到我们赋予异常类的一些特殊行为,比如向日志里输出错误信息等
}
return pos->second;
}
(4).使用可能出现异常的功能函数时,使用try{} catch(){}块来截获异常并进行处理
try
{
image = &ImagesetManager::getSingleton().getImageset(imageSet)->getImage(imageName);
}
catch (UnknownObjectException&)
{
image = 0;
}
下面是一个Win32控制台下的ExceptionDemo
1 // ExceptionDemo.cpp : 定义控制台应用程序的入口点。 2 // 3 4 #include "stdafx.h" 5 #include<afx.h> 6 #include <string> 7 #include <afxwin.h> 8 9 using namespace std;10 11 12 class Exception13 {14 public:15 virtual ~Exception(void) {}16 const string& getMessage(void) const {return d_message;}17 const string& getName() const {return d_name; }18 const string& getFileName(void) const {return d_filename;}19 const int getLine(void) const {return d_line;}20 protected:21 Exception(const string& message = "", const string& name ="ExceptionDemo::Exception", 22 const string& filename = "", int line = 0) : d_filename(filename), d_line(line),d_message(message), d_name(name)23 {24 CString str;25 str.Format("name: %s in file: %s ( %d ): %s",name.c_str(),filename.c_str(),line,message.c_str());26 AfxMessageBox(str);27 }28 string d_message;29 string d_filename;30 string d_name;31 int d_line;32 };33 34 class UnknownObjectException : public Exception35 {36 public:37 UnknownObjectException(const string& message, const string& file = "unknown", int line = 0)38 : Exception(message, "ExceptionDemo::UnknownObjectException", file, line) 39 {40 41 }42 };43 44 #define UnknownObjectException(message) 45 UnknownObjectException(message, __FILE__, __LINE__)46 47 48 void function(int n)49 {50 if (n>5)51 throw UnknownObjectException("pass the n volue limited!");52 }53 54 int _tmain(int argc, _TCHAR* argv[])55 {56 try57 {58 function(6);59 }60 catch (UnknownObjectException& e)61 {62 AfxMessageBox("抓到了异常!");63 }64 return 0;65 }
C++异常类的定义和使用以及我对异常类的理解