在C ++中抛出和捕获自定义异常的问题

时间:2011-06-12 20:00:54

标签: c++ visual-studio exception try-catch custom-exceptions

我创建了类 Someting ,当它无法实例化时会抛出异常 SomethingException (SomethingException继承自std :: exception)。问题是我无法捕捉 SomethingException (我不得不做一个肮脏的技巧来抓住它)。

程序中的某处执行: 这不起作用,未捕获异常且程序崩溃。

try{
    Something* s = new Something();
}
catch (SomethingException* e){
    std::cerr<<e.what();
}

相比之下,确实工作(捕获异常并显示正确的消息)但我确实感觉不应该这样做

try{
    Something* s = new Something();
}
catch (std::exception* e){
    SomethingException* e2 = (SomethingException*) e;
    std::cerr<<e.what();
}

因为指针是铸造的,所以当且仅当抛出一种类型的异常时,我才能使这个工作。我需要捕捉各种类型的那一刻都行不通。

有没有办法以更正确的方式捕获自定义异常?

编辑:

抛出异常如下

//...
throw new SomethingException ("Errormessage"); //Custom exception constructor
//...

Something :: Something()的声明是

Something::Something() throw(...)

使用声明

Something::Something() throw(SomethingException)
//or
Something::Something() throw(SomethingException*)

引发很多警告(警告C4290)

3 个答案:

答案 0 :(得分:7)

一般来说,最好按值抛出异常并通过引用捕获它们:

try {

    throw SomethingException();

} catch (const SomethingException& error) {

    std::cerr << error.what() << '\n';

}

如果您使用catch (SomethingException*)投放,则只能使用throw new SomethingException()捕获异常。您的问题中没有足够的信息可以说明,但问题可能出在SomethingException来自std::exception的问题。验证或更改它以继承,例如,std::runtime_errorstd::logic_error

另外,请勿使用throw说明符。只是不要。没有编译器为使用已检查的异常提供任何好处:实际上,已检查的异常未被检查除非在不符合的异常情况下失败(抛出std::bad_exception)说明符。这可能是你的代码中发生的事情。

答案 1 :(得分:6)

对于可能遇到问题的其他人,如果从std :: exception派生的自定义异常被抛出但未被捕获,请检查: - 继承是公开的 - 如果在另一个DLL中声明了异常,则从DLL导出异常类。奇怪的是,如果不是这样,这不会产生链接错误(在VS2012中),它就不会被捕获。

答案 2 :(得分:1)

您能否显示抛出异常的代码。

另一点是关于抛出规格 - 这通常是一个坏主意。问题是,与Java不同,C ++不会坚持使用throw-specs,因此你不会从中受益。如果您的代码(或您调用的某些代码)抛出未在throw-spec中指定的异常

,他们所能做的就是潜在地导致核心转储