代码之家  ›  专栏  ›  技术社区  ›  Paul Floyd

类定义不可见时捕获异常

  •  3
  • Paul Floyd  · 技术社区  · 6 年前

    std::exception .

    我尝试简单地向前声明exception类,因为我只是通过引用来捕获它。然而,这给了我一个机会 error: invalid use of incomplete type

    所以这就是我想做的:

    // library.cpp
    
    namespace FOO {
    
    struct SomeException : public std::exception
    {
        // string member, virtual dtor, ctor taking one arg and virtual what()
    };
    
    void doStuff() {
    }
    
    }
    
    
    // my main.cpp
    namespace FOO
    {
       struct SomeException;
    }
    
    int main()
    {
        try
        {
            FOO::doStuff();
        }
        catch (FOO::SomeException& e)
        {
            // ignore e, but I know where it came from so log
            // an appropriate message
        }
        catch (std::exception& e)
        {
            // most other exceptions, log `what()` message
        }
        catch(...)
        {
            // tell user to contact customer support
        }
    }
    

    只是打印 what() 消息不适合我的上下文。

    但这看起来很难看。

    还有其他选择吗?

    1 回复  |  直到 6 年前
        1
  •  1
  •   Davis Herring    6 年前

    如果您没有访问原始类的权限,则无法正确捕获它:

    C++标准/ [除句柄]:

    这个 在一个 处理程序 描述的类型 可能导致这种情况的例外情况 处理程序 待输入。 这个 例外声明 例外声明

    所以没有理想的干净的解决方案。但可能是一个可以接受的解决方法:从 std::exception typeid() (最终与 type_index )确定 catch (std::exception& e) 阻止。

    依我看,这应该是一个可以接受的方法来区分未知的异常 .what() 不是另一种选择。然而,不便之处在于 type_info 数据(例如。 typeid(e).name()

    概念证明:

    //somewhere
    class MyExcept : public std::exception { };
    
    ...
    
    // somewhere else
    try {
        throw std::exception();
    } catch (std::exception &e) {
        std::cout <<"case 1: " << typeid(e).name() << std::endl;
    }
    
    try {
        throw MyExcept();
    } catch (std::exception &e) {
        std::cout <<"case 2: "<< typeid(e).name() << std::endl;
    }
    

    Online demo