`

[C++][Error Code]如何定义Error Code框架

 
阅读更多
对于不同的项目而言,error code返回机制是不一样的,但是能够很好的管理好不同模块间的Error Code并不是一件简单的事情,下面有一种比较简便的方法如下:

/**************************************************************************************************/
/*!
    \file CommonErrors.h

    \attention
        (c) Jacky Dai 2011~2016
        All Rights Reserved.
*/

/**************************************************************************************************/

#ifndef XX_COMMON_ERRORS_H
#define XX_COMMON_ERRORS_H

/*** Include Files ********************************************************************************/

/*** Defines/Macros/Constants/Typedefs ************************************************************/

namespace XXSpace
{
//basic mask code
const unsigned int COMPONENT_MASK       = 0x8000;

//component code
const unsigned int COMPONENT_LOGIN            = 0x0001;
const unsigned int COMPONENT_DATAMANAGER      = 0x0002;

//
//0x0000XXXX:XXXX means component code
//0xXXXX0000:XXXX means error code of component

//Define some marcos/functions here
#define SYSTEM_ERROR_FLAG (0x4000)
#define SYSTEM_ERROR(code) ((code | SYSTEM_ERROR_FLAG) << 16)
#define ERROR_IS_SYSTEM_ERROR(err) (((err >> 16) & SYSTEM_ERROR_FLAG) != 0)

#define COMPONENT_ERROR(component, code) ((code << 16) | (component & ~(COMPONENT_MASK)))
#define CODE_FROM_ERROR(err) (static_cast<short>(err >> 16))

//All of the error code is here
typedef enum
{
                                                                                 //   Hex        | Decimal       | Descriptio
    //Basic error
    ERR_OK                                 = 0x00000000,                         //<< 0x00000000 |  0            | No error.
    ERR_SYSTEM                             = SYSTEM_ERROR(1),                    //<< 0x00010000 | 65536         | General system error.
    ERR_TIMEOUT                            = SYSTEM_ERROR(2),                    //<< 0x00020000 | 131072        | Time out.
    
    //login component
    LOGIN_ERROR_UNKNOWN_ERROR              = COMPONENT_ERROR(COMPONENT_LOGIN, 1),     //<< 0x00010001 |65537    | Unrecognized error.
    LOGIN_ERROR_UNKNOWN_USER_NAME          = COMPONENT_ERROR(COMPONENT_LOGIN, 2),     //<< 0x00020001 |131073   | Unrecognized user name, it is case sensitive.
    
    //data manager component
    DATAMANAGER_ERROR_UNKNOWN_ERROR        = COMPONENT_ERROR(COMPONENT_DATAMANAGER, 1), //<< 0x00010002 |65538   | Unrecognized error.
    DATAMANAGER_ERROR_MISSING_CONNECTION   = COMPONENT_ERROR(COMPONENT_DATAMANAGER, 2)  //<< 0x00020002 |131074   | Connection missed.
} XXCommonError;


/**************************************************************************************************/
/*!
    \class ErrorHelper

    Class with commands for translating error codes to useful strings.

*/
/**************************************************************************************************/
class ErrorHelper
{
public:
    static const char* getErrorName(XXCommonError error);
    static const char* getErrorDescription(XXCommonError error);
};

} // XXSpace

#endif //XX_COMMON_ERRORS_H


/**************************************************************************************************/
/*!
    \file CommonErrors.cpp

    \attention
        (c) Jacky Dai 2011~2016
        All Rights Reserved.
*/

/**************************************************************************************************/

/*** Include Files ********************************************************************************/
#include "CommonErrors.h"

/*** Defines/Macros/Constants/Typedefs ************************************************************/

namespace XXSpace
{
/*** Public Methods ******************************************************************************/
const char* ErrorHelper::getErrorName(XXCommonError error)
{
    const char* result = "UKNOWN";

    switch (error)
    {
        case ERR_OK: result = "ERR_OK"; break;
        case ERR_SYSTEM: result = "ERR_SYSTEM"; break;
        case ERR_TIMEOUT: result = "ERR_TIMEOUT"; break;
        case LOGIN_ERROR_UNKNOWN_ERROR: result = "LOGIN_ERROR_UNKNOWN_ERROR"; break;
        case LOGIN_ERROR_UNKNOWN_USER_NAME: result = "LOGIN_ERROR_UNKNOWN_USER_NAME"; break;
        case DATAMANAGER_ERROR_UNKNOWN_ERROR: result = "DATAMANAGER_ERROR_UNKNOWN_ERROR"; break;
        case DATAMANAGER_ERROR_MISSING_CONNECTION: result = "DATAMANAGER_ERROR_MISSING_CONNECTION"; break;
        default: break;
    }

    return result;
}

const char* ErrorHelper::getErrorDescription(XXCommonError error)
{
    const char *result = "UKNOWN";

    switch (error)
    {
        case ERR_OK: result = "No error."; break;
        case ERR_SYSTEM: result = "General system error."; break;
        case ERR_TIMEOUT: result = "Time out."; break;
        case LOGIN_ERROR_UNKNOWN_ERROR: result = "Unrecognized error."; break;
        case LOGIN_ERROR_UNKNOWN_USER_NAME: result = "Unrecognized user name, it is case sensitive."; break;
        case DATAMANAGER_ERROR_UNKNOWN_ERROR: result = "Unrecognized error."; break;
        case DATAMANAGER_ERROR_MISSING_CONNECTION: result = "Connection missed."; break;
        default: break;
    }

    return result;
}

} // XXSpace


One sample for this architecture, it's easy to control, isn't it? Any problems, please let me know.
#include <Windows.h>
#include "CommonErrors.h"
#include <iostream>
using namespace std;


/**************************************************************************************************/
/*!
    \class XXStub

    Stub class for the XXXX.
*/
/**************************************************************************************************/
class Login{};
class LoginStub : public Login
{
public:
    typedef enum
    {
        ERR_OK                        = XXSpace::ERR_OK,
        ERR_SYSTEM                    = XXSpace::ERR_SYSTEM,
        ERR_TIMEOUT                   = XXSpace::ERR_TIMEOUT,
        LOGIN_ERROR_UNKNOWN_ERROR     = XXSpace::LOGIN_ERROR_UNKNOWN_ERROR,
        LOGIN_ERROR_UNKNOWN_USER_NAME = XXSpace::LOGIN_ERROR_UNKNOWN_USER_NAME
    } Errors;
    
    Errors DoLogin(const char* userName, const char* password);
    const char* GetLoginStubErrorName(Errors error);
    const char* getErrorDescription(Errors error);
};

LoginStub::Errors LoginStub::DoLogin(const char* userName, const char* password)
{
    if( userName==NULL
     || password==NULL )
    {
        return LOGIN_ERROR_UNKNOWN_USER_NAME;
    }        
    
    return ERR_OK;
}

const char* LoginStub::GetLoginStubErrorName(Errors error)
{
    return XXSpace::ErrorHelper::getErrorName(static_cast<XXSpace::XXCommonError>(error));
}

const char* LoginStub::getErrorDescription(Errors error)
{
    return XXSpace::ErrorHelper::getErrorDescription(static_cast<XXSpace::XXCommonError>(error));
}

class DataManager{};
class DataManagerStub : public DataManager
{
public:
    typedef enum
    {
        ERR_OK                               = XXSpace::ERR_OK,
        ERR_SYSTEM                           = XXSpace::ERR_SYSTEM,
        ERR_TIMEOUT                          = XXSpace::ERR_TIMEOUT,
        DATAMANAGER_ERROR_UNKNOWN_ERROR      = XXSpace::DATAMANAGER_ERROR_UNKNOWN_ERROR,
        DATAMANAGER_ERROR_MISSING_CONNECTION = XXSpace::DATAMANAGER_ERROR_MISSING_CONNECTION
    } Errors;

    Errors Test();
    const char* GetDataManagerStubErrorName(Errors error);
    const char* getErrorDescription(Errors error);
};

DataManagerStub::Errors DataManagerStub::Test()
{
    return DATAMANAGER_ERROR_UNKNOWN_ERROR;
}

const char* DataManagerStub::GetDataManagerStubErrorName(Errors error)
{
    return XXSpace::ErrorHelper::getErrorName(static_cast<XXSpace::XXCommonError>(error));
}

const char* DataManagerStub::getErrorDescription(Errors error)
{
    return XXSpace::ErrorHelper::getErrorDescription(static_cast<XXSpace::XXCommonError>(error));
}


//////////////////////////////////////////////////////////////////////////
void main()
{
    LoginStub cLogin;
    LoginStub::Errors loginError = cLogin.DoLogin(NULL, NULL);
    cout << hex << loginError << " = ";
    cout << cLogin.GetLoginStubErrorName(loginError) << endl;
    cout << cLogin.getErrorDescription(loginError) << endl;

    DataManagerStub dm;
    DataManagerStub::Errors dmError = dm.Test();
    cout << hex << dmError << " = ";
    cout << dm.GetDataManagerStubErrorName(dmError) << endl; 
    cout << dm.getErrorDescription(dmError) << endl; 
}
分享到:
评论

相关推荐

    [C++][Error Code]如何定义Error Code框架 2

    总之,通过定义错误代码枚举和提供`ErrorHelper`类,我们可以创建一个结构化的错误处理框架,便于在C++项目中管理和报告错误。这不仅可以提高代码的可读性和可维护性,还能帮助开发者更快地定位和解决问题。在实际...

    解决createprocess error code 740

    标题 "解决createprocess error code 740" 指的是在尝试运行一个应用程序时遇到的一个特定错误,其中 `CreateProcess` 是 Windows API 中用于创建新进程的函数。错误代码 740 表示 "请求的操作需要提升的权限",意味...

    dlna C++ source code

    在这个“dlna C++ source code”中,我们很显然将探讨如何使用C++编程语言实现DLNA规范的相关功能。 首先,我们需要了解DLNA的核心概念。DLNA标准主要由以下组件构成: 1. **设备(Devices)**:DLNA网络中的任何...

    Demo - Replace Error Code With Exception

    "Demo - Replace Error Code With Exception" 这个主题着重于将传统的错误码机制替换为异常处理机制,以提高代码的可读性、可维护性和异常处理的效率。 错误码通常是通过返回特定的整数值来指示函数或方法执行期间...

    【Visual C++】Code_Note_2

    博文的配套源码 《【 Visual C++】游戏开发笔记之二——最简单的directx,vc窗口的编写 》 ,原文地址为http://blog.csdn.net/zhmxy555/article/details/7318634, 源码编译环境为vs2010. 我的博客地址是...

    no bugs!delivering error-free code in c & c++

    no bugs!delivering error-free code in c & c++

    WIN32_ERROR code

    在Windows平台进行C++程序开发时,开发者经常需要处理各种系统调用或API函数返回的错误信息。为了帮助VC++开发初学者能够快速查找并理解这些错误代码,从而提高开发效率,本篇文章将详细介绍一系列常见的Win32错误...

    symbian 错误对应表error_code

    在Symbian操作系统中,错误处理是通过一个称为`error_code`的机制来实现的。这个机制为开发者提供了一种标准化的方式来识别和处理程序运行时出现的问题。`error_code`是一个整数值,它对应于特定的错误信息或状态,...

    c++_code_php_

    标题中的"c++_code_php_"似乎暗示了这是一个与C++和PHP编程相关的项目,其中可能包含用这两种语言编写的代码。描述中提到"php code that calculate features",这表明涉及的PHP代码是用来计算某些特性或功能的。由于...

    ECC.rar_ecc code_ecc error code_error correction_hd dvd

    错误纠正码(Error Correction Code,ECC)是数据通信和存储系统中的一种关键技术,用于检测和纠正传输或存储过程中可能出现的错误。ECC在高清DVD(HD DVD)等媒体存储设备中扮演着至关重要的角色,确保了数据的可靠...

    C++标准库_The C++ Standard Library_英文版.pdf )

    The C++ Standard Library provides a set of common classes and interfaces that greatly extend the core C++ language. Josuttis' book not only provides comprehensive documentation of each library ...

    pycharm安装所需软件Microsoft Visual C++ 14.0安装包

    error: Microsoft Visual C++ 14.0 is required. Get it with "Build Tools for Visual Studio": https://visualstudio.microsoft.com/downloads/ 安装twisted包的时候提示microsoft visual c++ 14.0 is required的...

    C# 捕获C/C++异常的例子

    在这里,我们首先调用了`MyCppFunction`,如果C++代码抛出了异常,我们检查`ErrorCode`是否非零。如果是,我们创建一个新的`ApplicationException`,将C++异常的信息包含其中,并重新抛出。这样,C#的异常处理机制就...

    《C++现代化程序设计》code

    《C++现代化程序设计》是一本深入探讨C++现代编程技术的书籍,其"real_sample_code"压缩包包含了书中各个章节的实际示例代码。这些代码旨在帮助读者理解并实践C++的最新特性和最佳实践,从而提升编程技能。在本文中...

    NXP codewarrior 编译报错解析合集 Build Tools Message Reference

    例如,C/C++ Error 10100表示“未声明的标识符”,这通常意味着在代码中引用了一个尚未定义的变量或函数。同样,Error 10101和10102分别对应于“预期的表达式”和“预期的分号”,这些都是语法错误,提示开发者检查...

    iFFT.rar_BPSK c++ code_ifft

    标题 "iFFT.rar_BPSK c++ code_ifft" 暗示了这是一个与数字信号处理相关的项目,具体是使用C++实现BPSK(二进制相移键控)调制并涉及到快速傅里叶逆变换(iFFT)。描述中提到的"error correct coding"表明这是关于...

    C++11学习总结.doc

    ERRORCODE OnLineDebug::_func(std::function&lt;ERRORCODE(uint32_t&)&gt; func_) noexcept { // ... (代码省略) } ERRORCODE OnLineDebug::_CheckCfgUUID(uint32_t& cmdid) { // ... (代码省略) } ``` 在 C++11 的...

    Functional Programming in C++

    Well-written code is easier to test and reuse, simpler to parallelize, and less error prone. Mastering the functional style of programming can help you tackle the demands of modern apps and will lead ...

Global site tag (gtag.js) - Google Analytics