从理论上讲,你总是可以抛出复杂的例外,但在大多数情况下你可能不需要。
我的问题是,这种方法可以吗?
是的,没有。从理论上讲,你可以通过一切手段做到这一点,但它不是很好的做法(请阅读下文)。如果你仍然这样做,至少我会建议#define
错误代码,以提高可读性。
#define UNEXPECTED_END_OF_STREAM -2
if(strm->atEnd()){
// unexpected end of stream
throw UNEXPECTED_END_OF_STREAM;
}
将-ve数作为错误代码/异常抛出是非常罕见的,它很可能会被忽略。事实上,人们会皱起眉头,即使它会完全按照你想做的事情(至少在大多数情况下)抛出异常,那就是发现一个错误。
我抛出的最常见的异常是std :: runtime_error(“我的错误”)`这是伪装成抛出一个简单的字符串异常。在大多数情况下,我们需要基本的例外,检测错误并返回。
记住无论你抛出什么样的异常,你总能得到try-catch
块的好处,这是异常处理的核心。如果抛出一个异常,情况也是如此。我想int
将很可能表明错误代码。有时候这可能需要说,如果你在一个DLL的内部使用异常,而是想要返回错误代码,而不是外部世界。我认为你的问题真的归结为这个问题,我可以抛出一个int
异常,我应该吗?
还要注意,虽然你可以做到这一点,但抛出一个int
异常并不是最优雅的事情。为什么?因为int
是原始数据时间,所以你想用C++思考面向对象,所以你最好抛出一个对象。这可能意味着您可能需要将int
错误代码封装到对象中并抛出该对象。也许当你这样做时,添加描述错误的字符串可能是个好主意。这是我过去所做的。我从std::runtime_error
衍生出我的异常类,并添加了错误代码。
class my_error : public std::runtime_error
{
public:
my_error(std::string const& msg, int code);
virtual ~my_error(void);
// the error code which you want to throw
int errCode;
};
现在,当你想抛出一个异常/错误代码,你这样做:
throw my_error("this is my own error!", UNEXPECTED_END_OF_STREAM);
来源
2014-05-22 18:41:51
zar
我可以做,当我在黑客的东西一起。但是当我完成它将始终生成一个真正的异常对象(从std :: rtuntime_error派生)。因为这简化了我所有的异常处理代码。假设你在main()中捕获它。你怎么知道哪个组件产生错误-345678? –