首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Catch语句被完全忽略

Catch语句被完全忽略
EN

Stack Overflow用户
提问于 2011-08-03 23:41:54
回答 6查看 10K关注 0票数 9

我遇到了一些我继承的代码的情况...老实说,我相信代码是正确编写的,但这个错误似乎仍然很明显。

我很快就会注意到代码是从linux交叉编译到LynxOS的,我不确定这是否与这个错误有关。

基本上,在一个特定的情况下:

代码语言:javascript
复制
try {
    std::vector<ClassA> x = SomeGeneratingFunction();

    //We get to here fine.  X may be empty/unpopulated though.
    if (x.size() < 1)
    {
        throw(MyException("It crashed."));
    }
}
catch (MyException e)
{
    //Handle it.
}
catch (...)
{
    //Handle it.
}

我们在向量未填充的情况下抛出,但由于某些原因,抛出会绕过catch子句--这两个子句都是。这似乎只发生在这里-尽管我们通常不会在if语句作用域中这样做,但这应该是完全无关的,因为它仍然在try作用域中。

PS:下面的代码实际上是一个函数的内容,当函数被调用时,异常会从函数中出来,即使它们都应该由catch块来处理。

你知道这是怎么实现的吗?是的,这不是真正的代码/异常类,但exception类是您谷歌重载std::exception的简单示例,并且SomeGeneratingFunction()确实返回了一个很好的向量,即使它是空的。我不能提供真正的代码,但这是非常接近的,除非有任何小的打字错误,我可能会把它从我的头顶。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2014-10-21 05:47:17

因为catch (...)子句没有捕捉到异常,所以我的答案不能解决OP的问题。但对于其他发现这个问题的人来说,也许我的答案是有用的,因为它解释了为什么第一个catch失败了。

我也遇到过类似的问题,我的catch(const std::exception& ex)就是不能工作。这被证明是一个愚蠢的问题,因为我在C#和C++异常之间切换,在C#中,当你抛出异常时,你需要指定new,而在C++中,你通常不需要指定(但你可以,但在这种情况下,你抛出的是一个指针,而不是引用)。我不小心做了

代码语言:javascript
复制
throw new std::runtime_error("foo");

所以

代码语言:javascript
复制
catch(std::exception*  ex)

会被抓到,但是

代码语言:javascript
复制
catch(std::exception& ex)

当然,解决方案就是删除新的语句,因为这不是C++中的传统设计模式。

票数 11
EN

Stack Overflow用户

发布于 2011-08-04 00:50:59

由于throw语句中的异常对象周围有一组空闲的圆括号,因此它看起来像是一个函数调用。有没有可能定义了一个名为throw的函数?异常构造函数的参数可以防止它成为Most Vexing Parse的牺牲品,但如果您的实际代码与示例不同,就有可能发生这种情况。

票数 1
EN

Stack Overflow用户

发布于 2011-08-03 23:45:31

代码语言:javascript
复制
catch (MyException e)

应为:

代码语言:javascript
复制
catch (const MyException &e)

我也不确定为什么你的抛出看起来像一个函数,有点奇怪。

编辑:

我在基于类似东西的捕获方面遇到了问题,尽管我同意在这个玩具箱中这是不够的。

对我来说,编译器似乎关闭了,Try被定义为有趣的东西吗?如果它是空的,那么如果您的编译器忽略catch语句而不尝试,这可能是有意义的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6929239

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档