【发布时间】:2011-06-12 20:00:53
【问题描述】:
我创建了类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)
【问题讨论】:
-
你为什么抛出一个指针而不是by value?
-
您的代码感觉就像您是一个从 C++ 开始的 Java 程序员。你使用异常的方式不是通常的 C++ 方式。
-
注意:从 std::runtime_error 派生异常比从 std::exception 更容易。这是因为 std::runtime_error 将为您存储由 what() 方法返回的错误消息(在构造函数中传递)。注意:MSVC 有一个非标准的 std::exception 允许您在构造函数中传递错误消息。