我该如何投球

How do I throw polymorphically?

本文关键字:何投球      更新时间:2023-10-16

class MyExceptionBase{};

    class MyExceptionDerived : public MyExceptionBase { }; 
        void f(MyExceptionBase& e) 
        {
     // ... throw e; 
        }  
        void g()
        { 
           MyExceptionDerived e;
         try{ 
              f(e);
             }
         catch (MyExceptionDerived& e)
         {
          ...code to handle MyExceptionDerived... 
         }
        catch (...)
        {
           ...code to handle other exceptions... 
        } 
    } 

如果您尝试这样做,在运行时,当输入catch(…)子句而不是catch(MyExceptionDerived&)子句时,会发生什么?

throw从概念上抛出异常对象的副本。由于您正在抛出函数f(),因此您正在切片MyExceptionBase的副本并抛出它。

注意:总是std::runtime_errorstd::logic_error派生异常库。