繁体   English   中英

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

[英]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_errorstd::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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM