/** @file /common/exc.h @brief Header s hierarchickym systemem vyjimek pro 8 kralovstvi. Stejne jako mame jednotny logovaci system pro celou hru, prislo mi taktez rozumne udelat jednotny hierarchicky system vyjimek, ktere nam podle me velmi usnadni ladeni v tom, ze se mohou jednodusse centralizovane odchytavat a stejne jednodusse diky polymorfismu urcime, co vyvolani vyjimky zpusobilo. Vsechny vyjimky odvozujte od zakladni tridy E_8K. UPDATE: Pro zlepseni prehlednosti mezi vyjimkami vyuzivejte makro COMMON_EXCEPTION. @author PZ @version 0.2 */ #ifndef __8K_EXCEPTIONS__ #define __8K_EXCEPTIONS__ #define EXCEPTION_DESCRIPTION_BUFF_LENGTH 256 #define EXCEPTION_FILENAME_BUFF_LENGTH 256 void handleUnexpectedException(); /// jednoduche makro pro vrhani vyjimek s indikaci radku a souboru zdrojaku #define THROW(E,p) {throw E(p,__FILE__,__LINE__);} /// jednoduche makro pro definici obecneho typu vyjimky - staci zadefinovat predka a jmeno vyjimky #define COMMON_EXCEPTION(parent,exc_name) class exc_name : public parent { public: exc_name() {}; exc_name(const char* description) : parent(description) {}; exc_name(const char* description,const char* filename,int linenumber) : parent(description, filename, linenumber) {}; ~exc_name() {}; } /** Trida predka pro vsechny vyjimky ve hre. Obsahuje datove polozky pro popis, jmeno zdrojoveho souboru a cislo radky, kde byla vyvolana. */ class E_8K { public: E_8K(); E_8K(const char* description); E_8K(const char* description,const char* filename,int linenumber); ~E_8K(); char* getDescription(); char* getFileName(); int getLineNumber(); protected: char desc[EXCEPTION_DESCRIPTION_BUFF_LENGTH]; char fn[EXCEPTION_FILENAME_BUFF_LENGTH]; int ln; }; /** Obecny predek pro vyjimky specificke pro modul AI */ COMMON_EXCEPTION(E_8K,E_8K_AI); COMMON_EXCEPTION(E_8K_AI,E_8K_AI_BadScriptCounting); COMMON_EXCEPTION(E_8K_AI,E_8K_AI_VarNotFound); COMMON_EXCEPTION(E_8K_AI,E_8K_AI_BadVarType); /** Obecny predek pro vyjimky specificke pro modul AI - Pathfind */ COMMON_EXCEPTION(E_8K_AI,E_8K_AI_Pathfind); COMMON_EXCEPTION(E_8K_AI_Pathfind,E_8K_AI_Pathfind_WrongMessageResponse); COMMON_EXCEPTION(E_8K_AI_Pathfind,E_8K_AI_Pathfind_BadFloodFillStartingPoint); /** Obecny predek pro vyjimky specificke pro modul AI - Diplomacie */ COMMON_EXCEPTION(E_8K_AI,E_8K_AI_Diplomacy); COMMON_EXCEPTION(E_8K_AI_Diplomacy,E_8K_AI_Diplomacy_DiplomatNotFound); COMMON_EXCEPTION(E_8K_AI_Diplomacy,E_8K_AI_Diplomacy_MaximumNumberOfDiplomats); COMMON_EXCEPTION(E_8K_AI_Diplomacy,E_8K_AI_Diplomacy_DiplomatWorldIDsNotUnique); COMMON_EXCEPTION(E_8K_AI_Diplomacy,E_8K_AI_Diplomacy_UnknownEvent); COMMON_EXCEPTION(E_8K_AI_Diplomacy,E_8K_AI_Diplomacy_RelationError); COMMON_EXCEPTION(E_8K_AI_Diplomacy,E_8K_AI_Diplomacy_InvalidBelief); COMMON_EXCEPTION(E_8K_AI_Diplomacy,E_8K_AI_Diplomacy_NotAIDiplomat); COMMON_EXCEPTION(E_8K_AI_Diplomacy,E_8K_AI_Diplomacy_InvalidEventWeight); /** Obecny predek pro vyjimky specificke pro modul AI - Strategy */ COMMON_EXCEPTION(E_8K_AI,E_8K_AI_Strategy); COMMON_EXCEPTION(E_8K_AI_Strategy,E_8K_AI_Strategy_NotUniqueVertexID); COMMON_EXCEPTION(E_8K_AI_Strategy,E_8K_AI_Strategy_VertexIDNotFound); COMMON_EXCEPTION(E_8K_AI_Strategy,E_8K_AI_Strategy_NotUniqueEdgeID); COMMON_EXCEPTION(E_8K_AI_Strategy,E_8K_AI_Strategy_EdgeIDNotFound); COMMON_EXCEPTION(E_8K_AI_Strategy,E_8K_AI_Strategy_ActionIDNotFound); COMMON_EXCEPTION(E_8K_AI_Strategy,E_8K_AI_Strategy_CityNotFound); COMMON_EXCEPTION(E_8K_AI_Strategy,E_8K_AI_Strategy_NoUnitPresent); COMMON_EXCEPTION(E_8K_AI_Strategy,E_8K_AI_Strategy_PlayerCantSeeTarget); COMMON_EXCEPTION(E_8K_AI_Strategy,E_8K_AI_Strategy_InvalidAttackEdge); COMMON_EXCEPTION(E_8K_AI_Strategy,E_8K_AI_Strategy_WrongPlanActionResponse); COMMON_EXCEPTION(E_8K_AI_Strategy,E_8K_AI_Strategy_WrongHistoryStackResponse); COMMON_EXCEPTION(E_8K_AI_Strategy,E_8K_AI_Strategy_AIDataReadingError); COMMON_EXCEPTION(E_8K_AI_Strategy,E_8K_AI_Strategy_InvalidAttackTarget); COMMON_EXCEPTION(E_8K_AI_Strategy,E_8K_AI_Strategy_InvalidBuildingStatistics); COMMON_EXCEPTION(E_8K_AI_Strategy,E_8K_AI_Strategy_CantFindUnitForAttack); COMMON_EXCEPTION(E_8K_AI_Strategy,E_8K_AI_Strategy_CantFindSelectedExpansionUnit); COMMON_EXCEPTION(E_8K_AI_Strategy,E_8K_AI_Strategy_AIPlanningThreadProblem); COMMON_EXCEPTION(E_8K_AI_Strategy,E_8K_AI_Strategy_InvalidBuildOrder); /** Obecny predek pro vyjimky specificke pro modul AI - MapAnalyzer */ COMMON_EXCEPTION(E_8K_AI,E_8K_AI_MapAnalyzer); COMMON_EXCEPTION(E_8K_AI_MapAnalyzer,E_8K_AI_MapAnalyzer_InvalidProductionBuildingPlacement); COMMON_EXCEPTION(E_8K_AI_MapAnalyzer,E_8K_AI_MapAnalyzer_InvalidPlayerEmpireCenter); COMMON_EXCEPTION(E_8K_AI_MapAnalyzer,E_8K_AI_MapAnalyzer_InvalidBridgeAnalysis); COMMON_EXCEPTION(E_8K_AI_MapAnalyzer,E_8K_AI_MapAnalyzer_UnitNotFoundOnMap); COMMON_EXCEPTION(E_8K_AI_MapAnalyzer,E_8K_AI_MapAnalyzer_CityNotFound); // Obecny predek pro vyjimky specificke pro modul World COMMON_EXCEPTION(E_8K, E_8K_World); // Chybny pristup do pole COMMON_EXCEPTION(E_8K_World, E_8K_OUT_OF_RANGE); // Neplatny vstup pro funkci, neplata data, neexistujici mapa apod. COMMON_EXCEPTION(E_8K_World, E_8K_INVALID_REQUEST); /// Neplatny obsah prenasenych dat (v datovych strukturach ci XML), vzajemna nekonzistence apod. COMMON_EXCEPTION(E_8K_World, E_8K_WORLD_INVALID_DATA); // Chyba vyvolená pri praci s TCL interpreterem COMMON_EXCEPTION(E_8K, E_8K_TCL_Error); // Neznamy nazev vstupni/vystupni promenne pri hledani promenne skriptu COMMON_EXCEPTION(E_8K_TCL_Error, E_8K_TCL_UnknownVariable); /** Obecny predek pro vyjimky Editoru */ COMMON_EXCEPTION(E_8K,E_8K_Editor); COMMON_EXCEPTION(E_8K_Editor,E_8K_Editor_InvalidCenters); /****************************************************************************** * * Vyjimky pro modul world * ******************************************************************************/ class E_8K_TCL_UnknownType: public E_8K{ public: E_8K_TCL_UnknownType(const char* d):E_8K(d){}; E_8K_TCL_UnknownType(const char* d,const char* f,int l):E_8K(d,f,l){}; }; class E_8K_Value_IncompatibleTypes: public E_8K{ public: E_8K_Value_IncompatibleTypes(const char* d):E_8K(d){}; E_8K_Value_IncompatibleTypes(const char* d,const char* f,int l):E_8K(d,f,l){}; }; /****************************************************************************** * * Vyjimky pro commandline * ******************************************************************************/ /** Predek pro vsechny vyjimky commandline. */ COMMON_EXCEPTION(E_8K, E_8K_CL); /****************************************************************************** * * Vyjimky pro modul GUI * ******************************************************************************/ /** Predek pro vsechny vyjimky GUI. */ COMMON_EXCEPTION(E_8K, E_8K_GUI); /** Vyjimka pro nacitac modelu. */ COMMON_EXCEPTION(E_8K_GUI, E_8K_ASE_READER); /** Vyjimka pro nacitac modelu. */ COMMON_EXCEPTION(E_8K_GUI, E_8K_TGA_READER); /****************************************************************************** * * Vyjimky pro modul RM/Network * ******************************************************************************/ /** Predek pro vsechny vyjimky RM */ COMMON_EXCEPTION(E_8K, E_8K_RM); /** Predek pro vsechny vyjimky Network */ COMMON_EXCEPTION(E_8K, E_8K_NET); /** Predek pro vsechny vyjimky pro prenos pres sit */ COMMON_EXCEPTION(E_8K_NET, E_8K_PACKAGE); /** Predek pro vsechny vyjimky vznikle pri kompresi */ COMMON_EXCEPTION(E_8K, E_8K_COMPRESSION); #endif