2012-12-08 28 views
2

我目前正在構建一個C++遊戲引擎作爲學習練習,並將異常合併到性能不太關鍵的部分中。我主要是PHP和Ruby開發者,所以我已經習慣了使用簡單的語法像這樣定期申報異常的新類:大型項目的C++異常

class SomeSubSystemException < Exception; end 

class SomeSubSystemException extends Exception {}; 

有一個簡單的在C++中執行此操作的語法,還是我會針對C++項目錯誤地處理異常處理?目前我必須爲每一類異常做以下事情,這使得我不想定義很多:

class SubSystemException : public MainException { 
    SubSystemException(std::string& msg) : MainException(msg) {} 
}; 

在此先感謝!

+0

你可以從'std :: exception'派生。 –

+0

我應該澄清,在這個例子中,MainException是從std :: runtime_error派生的,就像SubSystemException派生自MainException一樣 –

+0

有什麼問題?你必須寫兩行而不是一行?定義新的例外將不會成爲你工作的主要部分,是嗎? –

回答

3

定義一個宏,爲您做到這一點。

#define NEW_EXC(Derived, Base) class Derived : Base {\ 
Derived(const std::string& msg) : Base(msg) {} 

NEW_EXC(SubSystemException, MainException); 

#undef NEW_EXC 

完成。

Beware macros can be evil.

+0

而不是三行代碼,現在有四個。大! :-) –

+0

@BoPersson是的只是一個新的例外這不是很有效,但他說他定義了許多例外... – RedX

+0

我認爲他高估了他將不得不申報的例外數量。在一個非平凡的遊戲引擎中,會有*噸的代碼可供編寫。例外不會是主要問題。另外,對於宏,他會在一半的時間內得到錯誤分號(它是宏的一部分還是用途)。 :-) –

1

雖然我與博人的評論表示贊同說,這不會是你boilaerplate的主要來源,這裏的另一種方式爲它赫克:

使用CRTP

template<class T> 
class MainException : public std::runtime_error{ 
private: 
    MainException(std::string const& msg):std::runtime_error(msg){ } 
public: 
    static MainException<T> create(std::string const& msg){ 
    return MainException<T>(msg); 
    } 
}; 

//Usage: 
class MyException : public MainException<MyException> {}; 
void foo(){ 
    MyException::create(std::string("Foo")); 
}