在C ++中引发和捕获自定义异常的问题

| 我创建了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)     
已邀请:
        通常,最好按值抛出异常并按引用捕获它们:
try {

    throw SomethingException();

} catch (const SomethingException& error) {

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

}
如果要以
throw new SomethingException()
抛出异常,则只能以
catch (SomethingException*)
捕获异常。您的问题中没有足够的信息可以说明,但问题可能出在
SomethingException
是如何从
std::exception
衍生而来的。验证或将其更改为继承自例如“ 10”或“ 11”。 另外,请勿使用
throw
指示符。只是不要。没有编译器可以提供使用检查异常的任何好处:实际上,不检查检查异常,除非在异常不符合说明符的情况下严重失败(抛出
std::bad_exception
)。这可能就是您的代码中正在发生的事情。     
        对于其他人可能会引发但未捕获从std :: exception派生的自定义异常的问题的其他情况,请检查: -继承是公开的 -如果您的异常是在另一个DLL中声明的,则该异常类将从DLL中导出。奇怪的是,如果不是,这不会产生链接错误(在VS2012中),只是无法捕获。     
        您可以在抛出异常的地方显示代码吗? 另一个要点是关于抛出规范-这通常是一个坏主意。问题在于,与Java不同,C ++不坚持使用throw-specs,因此您几乎无法从中获得好处。如果您的代码(或您调用的某些代码)抛出了throw-spec中未指定的异常,则他们可能做的所有事情都可能导致核心转储。     

要回复问题请先登录注册