ogre3D学习基础11 -- 日志文件的使用与异常处理
用文件来记录 Ogre 系统初始化、运行、结束以及调试信息。使用日志便于我们调试程序。Ogre 日志系统由两个类组成:Log 类与 LogManager。
1、Log类
Log 类的一个对象对应于一个日志文件,log类中含有成员函数logMessage()负责向文件中填入信息。
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()。
Log* createLog( const String& name, bool defaultLog = false, bool debuggerOutput = true ); //
参数1对应日志文件名,参数2指是否把本文件设置为默认的日志文件,参数3指是否同时向调试窗口输出信息。
成员函数1, getLog()函数,通过文件名获取其他日志文件。
Log* getLog( const String& name);
成员函数2, setLogDetail()函数,参数和Log的一样,分三种,参考上文。
成员函数3, getDefaultLog()函数获取默认日志文件。
Log* getDefaultLog();
成员函数4, logMessage()函数向日志文件写入数据。有两个重载函数
void logMessage( const String& message, LogMessageLevel lml = LML_NORMAL); //同log的成员函数
void logMessage( LogMessageLevel lml, const char* szMessage, ... ); //可一次写入多条信息
实例代码:
直接在createScene函数里添加如下代码:
void createScene(void)
{
Log *p_Log = LogManager::getSingleton().createLog( "test.log" ); //创建日志文件
p_Log->logMessage( "this is a test!" ); //写入信息
}
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 ) )
例子如下:
SwapTestApplication app;
try
{
app.go();
}
catch (Ogre::Exception& e)
{
#if OGRE_PLATFORM == OGRE_PLATFORM_WIN32
MessageBoxA(NULL, e.getFullDescription().c_str(), "Anexception has occurred!", MB_OK | MB_ICONERROR | MB_TASKMODAL);
#else
fprintf(stderr, "An exception has occurred: %s\n",e.getFullDescription().c_str());
#endif
}
这段话说明了你在设计程序时可以选择控制台应用程序,也可以选择windows应用程序,选择不同,处理方式也不同。
其中的try{}catch{}语句就是一场处理,在运行过程中,如果出现异常,就会自动抛出,而catch语句捕获异常并给出提示信息。
ogre3D学习基础11 -- 日志文件的使用与异常处理的更多相关文章
- ogre3D学习基础11 -- 交换两个场景管理器
这一节,练习一下前几次学习的内容,功能很简单,就是建立两个不同的场景管理器,当按下键盘上某个键时切换镜头. 基本框架不变,这个监听器继承了两个父类,一个是我们的老朋友ExampleFrameListe ...
- Go语言学习之11 日志收集系统kafka库实战
本节主要内容: 1. 日志收集系统设计2. 日志客户端开发 1. 项目背景 a. 每个系统都有日志,当系统出现问题时,需要通过日志解决问题 b. 当系统机器比较少时,登陆到服务器上查看即可 ...
- ogre3D学习基础1 -- 核心对象与脚本技术
一.核心对象介绍1.命名空间 Ogre3d使用了C++的特性--命名空间,可以防止命名混淆.使用方法也简单,using namespace Ogre;或者直接在使用时加上“Ogre::”的前缀,如Og ...
- ogre3D学习基础5 -- 阴影与动画
五.阴影 阴影是渲染一个真实场景的重要组成部分,它可以给场景中的物体提供更加真实的感觉,同时还可以帮助用户更好的了解对象间的空间关系. 启用阴影: 缺省情况下,阴影是关闭的,开启方式如下: 1.建立场 ...
- ogre3D学习基础18 -- 材质的使用与脚本的简单书写
这一节以基础16为基础,练习材质的使用. 第一,看看框架 //material #include "ExampleApplication.h" class TutorialAppl ...
- ogre3D学习基础3 -- 粒子与表层脚本
9.粒子脚本 粒子脚本允许你实例化地在你的脚本代码中定义粒子系统,而不必在源代码中进行设置,使得你做任何修改都能得到快速回应.脚本里定义的粒子系统被用作模板,并且多个实际的系统可以在运行时从这里被创建 ...
- CUBRID学习笔记 13 日志文件
欢迎转载 ,转载时请保留作者信息.本文版权归本人所有,如有任何问题,请与我联系wang2650@sohu.com . 过错 CUBRID Broker Log Files 可以理解为数据库中间件日志 ...
- Python学习—基础篇之文件操作
文件操作 文件操作也是编程中需要熟练掌握的技能,尤其是在后台接口编写和数据分析过程中,对各种类型的文件进行操作,获取文件信息或者对信息进行存储是十分重要的.本篇博客中将主要对常见的文本格式文件和Exc ...
- android基础篇------------java基础(11)(文件解析xml and Json )
一:xml文件解析 首先看一下:我们要解析的内容: <?xml version="1.0" encoding="gbk" ?> - <book ...
随机推荐
- css3响应式表格
<h1>极客学院相关课程</h1> <table class="responsive"> <thead> <tr> &l ...
- Bootstrap设置按钮禁用
在Bootstrap中,按钮可以使用button标签或者a标签.设置按钮禁用可以通过两种方式,一种是通用CSS样式,一种是用过JS脚本动态设置,下面举例说明! <!DOCTYPE html> ...
- Windows Azure 配置Active Directory 主机(1)
现在越来越多企业将自己业务系统迁移云端,方便公司日常运维管理.这篇文章将简单介绍一下,从 Windows Azure 虚拟网络上的虚拟机 (VM) 中的 Corp Active Directory 林 ...
- ABAP vs Java, 蛙泳 vs 自由泳
去年7月定下的一年之内学会自由泳的目标终于实现了,特来还愿. ABAP和Java, 蛙泳和自由泳.前面的组合是Jerry用来挣钱养家的技术,后者是Jerry花了大量业余时间和金钱苦练的技能.或许有的朋 ...
- AE开发关于OnMapReplaced方法的使用原理
The OnMapReplaced event is triggered whenever the IMapControl2::Map is replaced by another map, such ...
- halt, reboot, poweroff - 中止系统运行
SYNOPSIS /sbin/halt [-n] [-w] [-d] [-f] [-i] [-p] /sbin/reboot [-n] [-w] [-d] [-f] [-i] /sbin/powero ...
- python_81_标准库_时间模块
''' 标准库: 1.time 时间的三种表示方法:a:时间戳(timestamp) b:格式化的时间字符串 c:元组(struct_time)共九个元素 time.struct_time(tm_ye ...
- iOS 绘制1像素的线
一.Point Vs Pixel iOS中当我们使用Quartz,UIKit,CoreAnimation等框架时,所有的坐标系统采用Point来衡量.系统在实际渲染到设置时会帮助我们处理Point到P ...
- 基础的Mapgis三维二次开发-插件式
最近在做一个杭州石油的项目开发一个小系统. 1.命令必须是 ICommand 的派生类 using System; using System.Collections.Generic; using Sy ...
- 【莫队】bzoj4542: [Hnoi2016]大数
挺有意思的,可以仔细体味一下的题:看白了就是莫队板子. Description 小 B 有一个很大的数 S,长度达到了 N 位:这个数可以看成是一个串,它可能有前导 0,例如00009312345.小 ...