00001 #if !defined(__MCTHROW_H_)
00002 #define __MCTHROW_H_
00003
00004 #ident "@(#)$Id: MCThrow.h,v 1.5 2004/12/02 07:05:20 mike Exp $"
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #include "mcllib/MCExcept.h"
00026 #include "mcllib/MCStringStream.h"
00027
00028 namespace mcllib
00029 {
00039 template<typename MCEXT> class MCThrowWrapper : public MCEXT
00040 {
00041 public:
00042 MCThrowWrapper(const MCEXT& ex) : MCEXT(ex) { }
00043 MCThrowWrapper(const MCEXT& ex, const char* file, int line)
00044 : MCEXT(ex)
00045 {
00046 setFileLine(file, line);
00047 }
00048 inline MCEXT& operator+=(const MCStringStream& mcss)
00049 {
00050 complete(mcss);
00051 return(*this);
00052 }
00053 };
00054
00060 template<typename MCEXT>
00061 MCThrowWrapper<MCEXT>
00062 MCExceptMaker(const MCEXT& ex, const char* file, int line)
00063 {
00064 if (ex.getMsg().hasSrc()) {
00065
00066 return(MCThrowWrapper<MCEXT>(ex));
00067 } else {
00068
00069 return(MCThrowWrapper<MCEXT>(ex, file, line));
00070 }
00071 }
00073 MCThrowWrapper<mcllib::MCExcept>
00074 MCExceptMaker(const char* msg, const char* file, int line);
00075 };
00076
00083 #define MCThrow(ex) MCThrowFileLine((ex), __FILE__, __LINE__)
00084
00090 #define MCThrowFileLine(ex, file, line) \
00091 throw mcllib::MCExceptMaker((ex), (file), (line)) \
00092 += mcllib::MCStringStream()
00093
00094 #endif