[英]Problem throwing and catching custom exceptions in C++
我创建了 class 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
派生。 验证或将其更改为从std::runtime_error
或std::logic_error
。
另外,不要使用throw
说明符。 只是不要。 没有编译器为使用检查异常提供任何好处:实际上,检查异常不会被检查,除非在发生不符合说明符的异常时可怕地失败(抛出std::bad_exception
)。 这可能就是您的代码中发生的事情。
对于可能遇到从 std::exception 派生的自定义异常被抛出但未捕获的问题的其他人,还要检查: - inheritance 是公共的 - 如果您的异常在另一个 DLL 中声明,则异常 ZA2F2ED4F8EBC2CBBDDZC2 是从 DLL 导出。 奇怪的是,如果不是,这不会产生链接错误(在 VS2012 中),它只是未能被捕获。
你能显示你抛出异常的代码吗?
另一点是关于 throw-specifications - 这通常是一个坏主意。 问题是 C++ 与 Java 不同,它不坚持抛出规格,因此您几乎不会从中受益。 如果您的代码(或您调用的某些代码)抛出未在 throw-spec 中指定的异常,他们所能做的就是可能导致核心转储
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.