2012-12-08 30 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")); 
}