//--------------------------------------------------------------------------- // @function: // CAutoTaskProxy::PropagateError // // @doc: // Propagate the error from sub task to current task // //--------------------------------------------------------------------------- void CAutoTaskProxy::PropagateError ( CTask *ptskSub ) { GPOS_ASSERT(m_fPropagateError); // sub-task must be in error status and have a pending exception GPOS_ASSERT(ITask::EtsError == ptskSub->Ets() && ptskSub->FPendingExc()); CTask *ptskCur = CTask::PtskSelf(); // current task must have no pending error GPOS_ASSERT(NULL != ptskCur && !ptskCur->FPendingExc()); IErrorContext *perrctxtCur = ptskCur->Perrctxt(); // copy necessary error info for propagation perrctxtCur->CopyPropErrCtxt(ptskSub->Perrctxt()); // reset error of sub task ptskSub->Perrctxt()->Reset(); // propagate the error CException::Reraise(perrctxtCur->Exc(), true /*fPropagate*/); }
//--------------------------------------------------------------------------- // @function: // CException::Raise // // @doc: // Throw/rethrow interface // //--------------------------------------------------------------------------- void CException::Raise ( CException exc ) { #ifdef GPOS_DEBUG if (NULL != ITask::PtskSelf()) { IErrorContext *perrctxt = ITask::PtskSelf()->Perrctxt(); GPOS_ASSERT_IMP(perrctxt->FPending(), perrctxt->Exc() == exc && "Rethrow inconsistent with current error context"); } #endif // GPOS_DEBUG throw exc; }
//--------------------------------------------------------------------------- // @function: // CErrorHandlerStandard::Process // // @doc: // Process pending error context; // //--------------------------------------------------------------------------- void CErrorHandlerStandard::Process ( CException exc ) { CTask *ptsk = CTask::PtskSelf(); GPOS_ASSERT(NULL != ptsk && "No task in current context"); IErrorContext *perrctxt = ptsk->Perrctxt(); CLogger *plog = dynamic_cast<CLogger*>(ptsk->PlogErr()); GPOS_ASSERT(perrctxt->FPending() && "No error to process"); GPOS_ASSERT(perrctxt->Exc() == exc && "Exception processed different from pending"); // print error stack trace if (CException::ExmaSystem == exc.UlMajor() && !perrctxt->FRethrow()) { if ((CException::ExmiIOError == exc.UlMinor() || CException::ExmiNetError == exc.UlMinor() ) && 0 < errno) { perrctxt->AppendErrnoMsg(); } if (ILogger::EeilMsgHeaderStack <= plog->Eil()) { perrctxt->AppendStackTrace(); } } // scope for suspending cancellation { // suspend cancellation CAutoSuspendAbort asa; // log error message plog->Log(perrctxt->WszMsg(), perrctxt->UlSev(), __FILE__, __LINE__); } }