c++ 如何在运行时通过错误代码给用户一个合适的异常?

标签 c++ exception polymorphism runtime

我需要创建一些接口(interface),它能够通过代码(int)给我合适的异常。
异常继承:

BaseException : public std::exception {...};
DerivedException1 : public BaseException {...};
DerivedException2 : public BaseException {...};

我需要像 get(int code) 这样的函数来解决这个问题:

try {
    int code = foo();
    throw get(code);
} 
catch(DerivedException1& e) {...}
catch(DerivedException2& e) {...}
catch(BaseException& e) {...}

先谢谢大家了!

最佳答案

throw 按值抛出,因此您可以使用以下方式进行切片:

std::exception& e = /*...*/;
throw e; // throws a std::exception, not possible derived class

那么你可能会这样做:

void as_exception(int error_code)
{
    switch (error_code)
    {
        case 0: return; // Not an error.
        case 1: throw DerivedException1();
        case 2: throw DerivedException2();
        // ...
    }
}

用法类似于:

try {
    const int code = foo();
    as_exception(code);
} 
catch (const DerivedException1& e) {...}
catch (const DerivedException2& e) {...}
catch (const BaseException& e) {...}

同样,您可以使用 std::exception_ptr方法如下:

std::exception_ptr as_exception_ptr(int error_code)
{
    switch (error_code)
    {
        case 0: return nullptr; // Not an error.
        case 1: return std::make_exception_ptr(DerivedException1());
        case 2: return std::make_exception_ptr(DerivedException2());
        // ...
    }
}

用法类似于:

try {
    const int code = foo();
    const auto eptr = as_exception_ptr(code);
    if (eptr) {
        std::rethrow_exception(eptr);
    }
} 
catch (const DerivedException1& e) {...}
catch (const DerivedException2& e) {...}
catch (const BaseException& e) {...}

关于c++ 如何在运行时通过错误代码给用户一个合适的异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59415414/

相关文章:

c++ - C++ 中一个类的多个接口(interface)

具有单例容器的 C++ 工厂模式组件创建器

c++ - Vim 合成错误消息总是隐藏的

c++ - 尝试运行程序时出现错误图像错误

c++ - 指向矩阵的指针在 C++ 中抛出异常

c++ - C++编程中内存分配较多时如何处理异常

c++ - Matlab矩阵逆函数在C++中的Eigen实现

c++ - 为什么这个 C++ 字符串长度计算函数比另一个更快?

laravel - 我用 composer 升级到 Laravel 5.3,它破坏了它

java - 如果我正在构建一个 linkedhashmap 并返回一个映射,我的调用函数是否会有一个 linkedhashmap