【问题标题】:catch exception qualified by namespace捕获由命名空间限定的异常
【发布时间】:2015-08-24 16:03:02
【问题描述】:

我有一个这样定义的异常:

namespace Splat {
    class MyException : public std::exception

在我的代码中我是这样理解的:

} catch (MyException &e) {
    ....
} catch (...) {
    ....

我明确声明异常的第一个 catch 块未能捕获异常,它在第二个 ... 通配符块中被捕获。

当我尝试使用其命名空间 Splat 来限定异常声明时,即

} catch (Splat::MyException &e) {

我收到一个错误:

MyCode.cpp:123: error: expected type-specifier
MyCode.cpp:123: error: expected unqualified-id before ‘&’ token
MyCode.cpp:123: error: expected ‘)’ before ‘&’ token
MyCode.cpp:123 error: expected ‘{’ before ‘&’ token
MyCode.cpp:123: error: ‘e’ was not declared in this scope

在我看来,第二种方法是正确的,因为我没有使用 using namespace Splat;Splat 明确加入我的命名空间。

我查看的各种示例表明,在您的 catch 语句中包含命名空间限定符非常好......

【问题讨论】:

  • 完全没问题。您是否忘记包含必要的标题?此外,第一件事不应该编译,除非它选择了一些不同的类型,称为MyException - 有这样的事情吗?归根结底,我们需要更多信息。
  • [OT]:我想你可以通过const 参考来了解。
  • 发布MCVE
  • @robert 那么恐怕不是 M。隔离问题是一项基本的编程技能。您需要继续扔掉不会导致错误消失的东西,或者从头开始并继续添加东西直到出现错误。很多时候,这个过程本身会给你解决方案(因为它会在问题出现/消失时查明确切的变化)。
  • 是的,你可以捕捉到std::exception 就好了,你自己的命名空间也不例外。你的错误在别处。

标签: c++ exception namespaces try-catch


【解决方案1】:

我明确声明异常的第一个 catch 块未能捕获异常,它被第二个 ... 通配符块捕获。

这告诉我 MyException 与 Splat::MyException 不同!

MyCode.cpp:123:错误:预期的类型说明符

这告诉我 Splat::MyException 不是类型,因此要么使用宏 MyException 要么 MyException 是声明的标识符(隐藏 Splat::Exception)。

另一种可能性是您使用宏 Splat 或 Splat 是已声明的标识符(隐藏命名空间 Splat ,不知道这是否可能)。

【讨论】:

  • 感谢您尝试回答而不是自愿提供生活指导建议...
  • 我在不同的模块中有一个冲突的头文件 - 感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多