【问题标题】:Can catch() be written to convert from one object type to another?可以编写 catch() 从一种对象类型转换为另一种对象类型吗?
【发布时间】:2013-05-01 20:16:40
【问题描述】:

鉴于此代码,其中A 位于第 3 方库中,B 是我编写的代码:

class A {...};
class B { public: B( const A &a ); ... };

try
{
    A a(...);
    throw a;
}
catch ( const B &b )
{
    // ...do stuff with B, like log the details to a file...
}

如果一个对象A 被抛出,那么我的catch B 将被跳过。我希望 B 有一个接受 A 对象的构造函数,这可能会起作用。

我可以做些什么来完成这项工作,还是我必须修改所有 catch 子句以处理同时捕获 AB

【问题讨论】:

  • 能否将 B 设为 A 的派生类,然后将 catch (const A&) {...} 改为无处不在?

标签: c++ exception try-catch


【解决方案1】:

不,那行不通。将抛出的对象与处理程序匹配时,不考虑用户定义的转换。根据 C++11 标准的第 15.3/3 段:

处理程序匹配E if 类型的异常对象

  • 处理程序的类型为 cv Tcv T&ET 是同一类型(忽略顶级 cv 限定符), 或

  • 处理程序的类型为cv Tcv T&,而TE 的明确公共基类,或者

  • 处理程序的类型为cv Tconst T&,其中T 是指针类型,E 是指针类型,可以 由两者之一或两者转换为T

    • 标准指针转换 (4.10) 不涉及到指向私有或受保护的指针的转换 或模棱两可的类

    • 资格转换

  • 处理程序的类型为cv Tconst T&,其中T 是指针或指向成员类型的指针,Estd::nullptr_t

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-23
    • 1970-01-01
    • 1970-01-01
    • 2020-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多