greenplumn CErrorContext 源码

  • 2022-08-18
  • 浏览 (339)

greenplumn CErrorContext 代码

文件路径:/src/backend/gporca/libgpos/include/gpos/error/CErrorContext.h

//---------------------------------------------------------------------------
//	Greenplum Database
//	Copyright (C) 2008 - 2010 Greenplum, Inc.
//	Copyright (C) 2011 EMC Corp.
//
//	@filename:
//		CErrorContext.h
//
//	@doc:
//		Error context to record error message, stack, etc.
//---------------------------------------------------------------------------
#ifndef GPOS_CErrorContext_H
#define GPOS_CErrorContext_H

#include "gpos/common/CStackDescriptor.h"
#include "gpos/error/CException.h"
#include "gpos/error/CMiniDumper.h"
#include "gpos/error/CSerializable.h"
#include "gpos/error/IErrorContext.h"
#include "gpos/io/ioutils.h"
#include "gpos/string/CWStringStatic.h"

#define GPOS_ERROR_MESSAGE_BUFFER_SIZE (4 * 1024)

namespace gpos
{
//---------------------------------------------------------------------------
//	@class:
//		CErrorContext
//
//	@doc:
//		Context object, owned by Task
//
//---------------------------------------------------------------------------
class CErrorContext : public IErrorContext
{
private:
	// copy of original exception
	CException m_exception;

	// exception severity
	ULONG m_severity{CException::ExsevError};

	// flag to indicate if handled yet
	BOOL m_pending{false};

	// flag to indicate if handled yet
	BOOL m_rethrown{false};

	// flag to indicate that we are currently serializing this.
	BOOL m_serializing{false};

	// error message buffer
	WCHAR m_error_msg[GPOS_ERROR_MESSAGE_BUFFER_SIZE];

	// system error message buffer
	CHAR m_system_error_msg[GPOS_ERROR_MESSAGE_BUFFER_SIZE];

	// string with static buffer allocation
	CWStringStatic m_static_buffer;

	// stack descriptor to store error stack info
	CStackDescriptor m_stack_descriptor;

	// list of objects to serialize on exception
	CList<CSerializable> m_serializable_objects_list;

	// minidump handler
	CMiniDumper *m_mini_dumper_handle;

public:
	CErrorContext(const CErrorContext &) = delete;

	// ctor
	explicit CErrorContext(CMiniDumper *mini_dumper_handle = nullptr);

	// dtor
	~CErrorContext() override;

	// reset context, clear out handled error
	void Reset() override;

	// record error context
	void Record(CException &exc, VA_LIST) override;

	// accessors
	CException
	GetException() const override
	{
		return m_exception;
	}

	const WCHAR *
	GetErrorMsg() const override
	{
		return m_error_msg;
	}

	CStackDescriptor *
	GetStackDescriptor()
	{
		return &m_stack_descriptor;
	}

	CMiniDumper *
	GetMiniDumper()
	{
		return m_mini_dumper_handle;
	}

	// register minidump handler
	void
	Register(CMiniDumper *mini_dumper_handle)
	{
		GPOS_ASSERT(nullptr == m_mini_dumper_handle);

		m_mini_dumper_handle = mini_dumper_handle;
	}

	// unregister minidump handler
	void
	Unregister(
#ifdef GPOS_DEBUG
		CMiniDumper *mini_dumper_handle
#endif	// GPOS_DEBUG
	)
	{
		GPOS_ASSERT(mini_dumper_handle == m_mini_dumper_handle);
		m_mini_dumper_handle = nullptr;
	}

	// register object to serialize
	void
	Register(CSerializable *serializable_obj)
	{
		m_serializable_objects_list.Append(serializable_obj);
	}

	// unregister object to serialize
	void
	Unregister(CSerializable *serializable_obj)
	{
		m_serializable_objects_list.Remove(serializable_obj);
	}

	// serialize registered objects
	void Serialize();

	// copy necessary info for error propagation
	void CopyPropErrCtxt(const IErrorContext *perrctxt) override;

	// severity accessor
	ULONG
	GetSeverity() const override
	{
		return m_severity;
	}

	// set severity
	void
	SetSev(ULONG severity) override
	{
		m_severity = severity;
	}

	// print error stack trace
	void
	AppendStackTrace() override
	{
		m_static_buffer.AppendFormat(GPOS_WSZ_LIT("\nStack trace:\n"));
		m_stack_descriptor.AppendTrace(&m_static_buffer);
	}

	// print errno message
	void AppendErrnoMsg() override;

	BOOL
	IsPending() const override
	{
		return m_pending;
	}

	BOOL
	IsRethrown() const override
	{
		return m_rethrown;
	}

	void
	SetRethrow() override
	{
		m_rethrown = true;
	}

};	// class CErrorContext
}  // namespace gpos

#endif	// !GPOS_CErrorContext_H

// EOF

相关信息

greenplumn 源码目录

相关文章

greenplumn CAutoExceptionStack 源码

greenplumn CAutoTrace 源码

greenplumn CErrorHandler 源码

greenplumn CErrorHandlerStandard 源码

greenplumn CException 源码

greenplumn CLogger 源码

greenplumn CLoggerStream 源码

greenplumn CLoggerSyslog 源码

greenplumn CMessage 源码

greenplumn CMessageRepository 源码

0  赞