• ogre3D学习基础11 -- 日志文件的使用与异常处理


      用文件来记录 Ogre 系统初始化、运行、结束以及调试信息。使用日志便于我们调试程序。Ogre 日志系统由两个类组成:Log 类与 LogManager。
      1、Log类

      Log 类的一个对象对应于一个日志文件,log类中含有成员函数logMessage()负责向文件中填入信息。

    1    void logMessage(const String& message, LogMessageLevel lml = LML_NORMAL); //

      第一个参数就是要写入的信息,第二个参数代表这条信息的重要程度,分三种

    参数值 重要程度
    LML_TIVIAL 最低
    LML_NORMAL 一般
    LML_CRITIAL 最高

      Log类中还有一个函数可用来设置日志文件的重要程度,

      void setLogDetail(LoggingLevel ll); //

        参数值分为三种:

    参数值  日志文件的重要程度
    LL_LOW 最低
    LL_NORMAL 一般
    LL_BOREME 最高

      2、LogManager类

      LogManager类用来管理各种日志文件,并负责向日志文件中输出信息。LogManager中含有创建Log对象的成员函数createLog()。

    1   Log* createLog( const String& name, bool defaultLog = false, bool debuggerOutput = true ); //

        参数1对应日志文件名,参数2指是否把本文件设置为默认的日志文件,参数3指是否同时向调试窗口输出信息。

      成员函数1,   getLog()函数,通过文件名获取其他日志文件。

    1  Log* getLog( const String& name); 

      成员函数2, setLogDetail()函数,参数和Log的一样,分三种,参考上文。

      成员函数3, getDefaultLog()函数获取默认日志文件。

     Log* getDefaultLog(); 

      成员函数4,  logMessage()函数向日志文件写入数据。有两个重载函数

    1  void logMessage( const String& message, LogMessageLevel lml = LML_NORMAL); //同log的成员函数
    2  void logMessage( LogMessageLevel lml, const char* szMessage, ... ); //可一次写入多条信息

      实例代码:

     直接在createScene函数里添加如下代码:

    1  void createScene(void) 
    2     { 
    3     Log *p_Log = LogManager::getSingleton().createLog( "test.log" ); //创建日志文件
    4     p_Log->logMessage( "this is a test!" ); //写入信息
    5 } 

       3、异常处理

      ogre支持异常处理,并且封装了自己的类Exception ,它记录了错误的详细信息(错误编号、详细描述、错误发生的文件名、行数等)。当有错误发生时,Ogre 会抛出这个类型的异常,并把这个异常记录的错误信息写入到 LogManager 的默认日志文件中。

      Exception类含有几个成员函数

        第一, getFullDescription,它的返回值是 String 类型的,保存了对错误的详细描述。

        第二, _pushFuntion(),_popFunction()函数,对所使用的函数名进行入栈出栈操作。

      几个辅助宏

      Except(num, desc, src ) 相当于 throw( Exception( num, desc, src, __FILE__, __LINE__ ) )。

    a, b, c 分别代表错误编号,错误描述与错误发生所在的函数。__FILE__和__LINE__是系统变量,它们的意思是错误发生时的代码文件和行数。 

      OgreGuard( a ) 相当于 Exception::_pushFunction( ( a ) )
      OgreUnguard( a ) 相当于 Exception::_popFunction( ( a ) )

     例子如下:

     1     
     2     SwapTestApplication app;
     3     
     4     try
     5     {
     6         app.go();
     7     }
     8     catch (Ogre::Exception& e)
     9     {
    10 #if   OGRE_PLATFORM == OGRE_PLATFORM_WIN32
    11         MessageBoxA(NULL, e.getFullDescription().c_str(), "Anexception has occurred!", MB_OK | MB_ICONERROR | MB_TASKMODAL);
    12 #else
    13         fprintf(stderr, "An exception has occurred: %s
    ",e.getFullDescription().c_str());
    14 #endif        
    15     }

      这段话说明了你在设计程序时可以选择控制台应用程序,也可以选择windows应用程序,选择不同,处理方式也不同。

      其中的try{}catch{}语句就是一场处理,在运行过程中,如果出现异常,就会自动抛出,而catch语句捕获异常并给出提示信息。

  • 相关阅读:
    犹太人高成就的秘诀
    EXSI宿主机更换硬盘后虚机启动有问题
    Centos7 系统启动docker报错 inotify add watch failed
    Gluster的搭建和使用
    关于HA(2.102 -2.103 服务器排障)
    Fabric的简介
    关于CPU的一些操作(CPU设置超频)
    docker的安装和技巧
    linux 下查看wwn号
    HP 3par多路径安装方法
  • 原文地址:https://www.cnblogs.com/songliquan/p/3305478.html
Copyright © 2020-2023  润新知