打印机打印时出现C++php exception 打印是什么原因

打印机打印列队中打印状态为错误的解决方式之一
右键【我的电脑(win7以上为“计算机”)】,点击【管理】,展开【服务和应用程序】,点击【服务】。
找到右侧的【print spooler】项,右键选择【停止】。
win+R打开运行,输入【spool】确定。
将【spool】下的【printers】里的文件全部删除。
回到【服务】将【print spooler】启动。
最后把打印机电源断开一分钟及重启电脑,这一步一定要做哦。
没有更多推荐了,51CTO旗下网站
打印机故障大全与解决方案(二)呕心沥血经典总结
如果喷墨印字头的喷嘴被堵塞,可更换墨盒(喷头和墨盒是一体化结构)来解决故障;如果控制喷墨的电路或喷墨印字头的驱动电路有故障,可更换已经损坏的晶体管,故障即可排除;如果是由字车电缆故障引起的,可更换字车电缆解决该故障。
作者:zol来源:zol| 17:41
20.只打印半个字符
问:我使用的是一台BJ330喷墨打印机,但在自检打印时,只打印出半个字符,这是为什么?
答:出现这种故障说明喷头只有一半在工作,通常由以下原因引起:
1 喷墨印字头的一半喷嘴被堵塞。
2 控制喷墨的电路有故障。
3 喷墨印字头的驱动电路发生故障。
4由字车电缆故障引起。
如果喷墨印字头的喷嘴被堵塞,可更换墨盒(喷头和墨盒是一体化结构)来解决故障;如果控制喷墨的电路或喷墨印字头的驱动电路有故障,可更换已经损坏的晶体管,故障即可排除;如果是由字车电缆故障引起的,可更换字车电缆解决该故障。
21.行走小车错位碰头
问:一台使用时间较长的喷墨打印机在打印资料时,时常发生行走小车错位碰头的情况,这是什么原因?
答:喷墨打印机行走小车的轨道是由两只粉末合金铜套与一根圆钢轴的精密结合来滑动完成的。虽然行走小车上设计安装有一片含油毡垫以补充轴上润滑油,但因生活环境中到处都有灰尘,时间一久,会因空气的氧化、灰尘的破坏使轴表面的润滑油老化而失效。这时如果继续使用打印机,就会因轴与铜套的摩擦力增大而造成小车行走错位,直至碰撞车头造成无法使用。一旦出现此故障应立即关闭打印机电源,用手将未回位的小车推回停车位。找一小块海绵或毡,放在缝纫机油里浸泡,用镊子夹住在主轴上来回擦拭。最好是将主轴拆下来,洗净后上油,这样的效果最好。另一种小车碰头是因为器件损坏所致。打印机小车停车位的上方有一只光电传感器,它是向打印机主板提供打印小车复位信号的重要元件。此元件如果因灰尘太多或损坏,打印机的小车会因找不到回位信号碰到车头,而导致无法使用,一般出此故障时需要更换器件。
22.打印机内部灰尘过多
问:我的打印机使用一年了,里面沾了许多灰尘,怕会给打印机造成许多故障,
想擦除灰尘,请问该如何处理?需要注意什么?
答:灰尘可能会给打印带来许多故障,所以为了保护打印机,就要定期为它除尘。首先打开喷墨打印机的盖板,用干净柔软的湿布清除打印机内部灰尘、污迹、墨水渍和碎纸屑。如果灰尘太多会导致字车导轴润滑不好,使打印头的运动在打印过程中受阻。可用脱脂棉签擦除导轴上的灰尘和油污,并补充流动性较好的润滑油,如缝纫机油。
为喷墨打印机内部除尘时注意:
1 要擦拭齿轮,不要擦拭打印头和墨盒附近的区域。
2一般情况不要移动打印头。特别是有些打印机的打印头处于机械锁定状态,用手无法移动打印头,如果强行用力移 动打印头,将会造成打印机机械部分 损坏。不能使用任何纸制品来清洁打印机内部,以免将纸屑残留在打印机内。不能使用挥发性液体(如稀释剂、汽油、喷雾型化学清洁剂)清洁打印机,以损坏打印机表面。
23.打印机软性喷头堵塞
问:我的打印机常常因为墨水在喷头上粘度变大,导致打印时经常有断线的情况发生,这是什么原因?
答:出现这种情况是因为打印机软性喷头堵塞所致。一般用原装墨水盒经过多次清洗即可恢复,但这样的方法太浪费墨水。最简单的办法是利用手中的空墨盒来进行喷头的清洗。用空墨盒清洗前,先要用针管将墨盒内残余墨水尽量抽出,越干净越好,然后加入清洗液(配件市场有售)。加注清洗液时,应在干净的环境中进行,将加好清洗液的墨盒按打印机正常的操作上机,不断按打印机的清洗按
钮对其进行清洗。利用墨盒内残余墨水与清洗液混合的淡颜色进行打印测试,正常之后换上好墨盒就可以使用了。
24.喷头堵塞
问:我的打印机使用了半年,最近喷嘴堵塞了,不能正常打印,请问该怎样修理?
答:打印喷头堵塞是打印机中经常会出现的现象,一般可分为软性堵塞和硬性堵塞。
所谓软性堵塞,是指因某种原因,如墨水有杂质且过滤不好、墨水质量有问题等,造成墨水在喷头上粘度变大所致的断线故障;打印头未回到保护罩内或未及时装入新墨盒,致使打印头在空气中暴露太久而干枯堵塞。这种问题可手动或用打印机自带的工具软件连续进行几次清洗即可解决。
而硬性堵塞是指喷头内有化学凝固物(墨水酸性过重与外壳塑胶料起化学作用而产生凝固、结晶体等)或有杂质造成堵塞,或因长期闲置不用而使墨水干涸凝固在打印头上。如果出现这类问题,可用清洗液注入空墨盒进行清洗;或者 将喷头从打印机拆下,用针筒进行清洗;还可以将拆下的喷头喷嘴浸入无水酒精或热水中几小时即可解决,但一定注意不要让电路板浸入到液 体中。
25.打印机喷嘴阻塞
问:我的打印机停用一段时间后,喷嘴经常阻塞,这是什么原因?
答:现在几乎所有的喷墨打印机内部皆有自动清洗喷嘴的设计,如果一段时间没
有使用打印机,则在开启电源时打印机本身即会执行清洗喷嘴的动作。此时打印机会利用其内部辅助系统,吸引墨匣中的墨水,将喷嘴中变稠、变干的墨水洗出,而避免其继续干涸而结晶。因此,即使不使用打印机,也要养成习惯至少两个星期启动机器一次,方能避免堵塞的风险。有些打印机只要电源保持在&ON&的位置,一段时间没有使用时,打印机会自动执行清洗的动作,一般的喷墨打印机都有这样的设计。用户可询问打印机制造商自己购买的打印机机种是否有该功能,若有,则永远不要关闭打印机的电源,借此便可消除故障,不过这样也比较耗电。另外许多用户平常大多只打印黑白文件,等到偶尔需要打印彩色文件时,才发现原来彩色喷嘴已阻塞。因此也应每两个星期至少打印一次彩色文件或清洗一次喷嘴。
26.打印头损坏
问:我的打印机的打印头经常损坏,请问什么原因会造成打印头损坏?
答:造成打印机的打印头损坏的原因有很多。供墨系统出现的小气泡容易在墨水入墨孔处形成空气阻隔,导致喷嘴供墨的突然中断,从而造成打印时出现断墨。这时必须对机器进行及时清洗,如果这种情况下继续打印就会损坏喷嘴,从而损坏打印头;打印头主件或副件的老化、变形,随时会使打印头容易受霉菌侵害,也是引起打印头损坏的原因之一;一般连续打印1小时后要休息几分钟,否则会影
响打印头的使用寿命。
27.主板上打印端口失效
问:使用打印机在单位的计算机上可以正常使用,但在家里的计算机上却不能打
印,检查打印机的打印端口时,发现端口设置不能更改。两台计算机主板采用的芯片分别为Intel芯片组和VIA芯片,这是什么原因?
答:这可能是因为家里计算机主板VIA芯片组驱动程序没有安装好,从而导致计算机上的打印端口失效,不能打印。到VIA官方网站下载最新的VIA芯片组驱动程序后,重新安装了Windows XP操作系统,再安装VIA芯片组的最新驱动程序,最后再将声卡、显卡之类的设备驱动安装好。重新安装打印机驱动程序后发现安装过程中,计算机系统已经能自动识别打印机了,这说明计算机的打印机端口已经正常工作。打印机驱动程序安装好后,进行打印测试,若发现 一切正常,则打印端口不能设置的问题也就解 决了。
28.打印一半后&死机&
问:我的打印机使用了一年一直正常,但最近在打印时经常出现打印到一半就&
死机&的现象,请问这是什么原因?
答:打印到一半就出现&死机&,主要由以下几个原因所造成:打印命令设置过多,计算机端口被占用而出现打印操作停止。
1 硬盘有坏扇区。
2计算机有病毒。
3打印机出现机械故障。
4计算机性能低下也会造成打印机&死机&。
如果打印操作命令设置过多,可减少操作指令以解决故障。如果是计算机的故障,可找计算机专业人员维修,直至解决故障。运行杀毒软件,检查计算机是否感染病毒,如果感染,杀毒即可。打印机出现机械故障,也可能导致打印机打印时&死机&的现象,找专业维修人员维修直至解决故障即可。
29.页码打印不正确
问:有一台HP LaserJet 2100激光打印机,在Word XP程序中打印文档时,发现该打印机只能打印两位数的页码,比方说打印页码100时,打印机输出的页面号码竟然为&10&,有时干脆页面号码根本就打印不出来。这是什么原因?
答:其实这是由字体的显示方式引起的。解决这个问题,可按照以下步骤进行:在&控制面板&窗口中,双击&打印机&图标打开打印机窗口后,选中当前计算机系统中安装使用的打印机图标名称,用鼠标右键单击并从打开的快捷菜单中选择&属性&命令,在随后打开的属性设置界面中,打开&字体&对话框。在这个对话框中,将会看到激光打印机在默认状态下,会将TrueType字体当作位图字体
来下载,此时只要在这里选中&将TrueType字体作为图形打印&这个选项,然后单击&确定&按钮退出。再重新打印时,打印机就可以将页码正确打印出 来了。
30.打印图像上出现横纹、白条或图文变浅、模糊
问:使用打印机打印时,打印出来的图像出现横纹或白条,且有时颜色变得很浅,很模糊,这是什么原因?
答:出现这样的问题主要有以下几个原因:
1介质设置与实际使用的类型不符。
2介质的正面朝下。
3喷头有脏物。
4 墨盒已近用完,墨水量低。
5 连续打印时间过长。
6 墨盒内有气泡。
遇到上述问题,可按照以下方法解决:
如果介质设置与实际使用类型不符,可修改驱动程序中的介质类型,使其与实际介质匹配;如果介质的正面朝下,可正确放置打印介质,注意打印面朝上;如果喷头有脏物,可清洗喷头;如果墨盒快用完、墨水量低造成这样的情况,可检查打印机控制面板上的墨水灯,准备更换墨盒;如果是因为连续打印时间过长,可暂停打印,关闭电源等候10~20分钟;如果是因为墨盒内有气泡造成这样的故障,清洗喷头即可。
31.垂直线条错位或出现竖纹
问:使用打印机打印时,图像出现垂直线条错位、竖纹等情况,这是什么原因?
答:出现这种情况有以下几个原因:
1打印头已脏,个别喷孔不出墨。
2 打印机驱动程序中的高速打印模式开启。
3 打印头错位。
4连续打印时间过长。
遇到上述问题,可遵循以下方法解决:
如果打印头已脏,个别喷孔不出墨,可清洗打印头;如果打印机驱动程序中的调
整打印模式开启,关闭该模式即可;如果打印头错位,运行驱动程序中的打印头对中校准程序;如果是因为连续打印时间过长导致这样的情况,可暂停打印,关闭电源等候10~20分钟。
32.使用彩色打印时图像不正确或缺色
问:有一台EPSON彩色打印机,在打印图像时经常会出现颜色不正确或缺色的情况,这该如何解决?
答:出现这种情况的原因有以下几种:
1打印机驱动程序中墨水设置为&黑色&。
2介质设置与实际使用的打印介质不符。
3介质的正面朝下。
4中间色调和模式选择与文件类型不符。
5打印头已脏,个别喷孔不出墨。
6墨盒墨水量低,一种或多种色彩的墨水已空。
7在打印设置正确的情况下,显示器色彩与实际打印色彩有偏差。
8应用软件或打印机驱动程序中的颜色设置需要调整。
9使用RGB模式打印,造成图像色彩完全失真。
依据以上原因,设定如下解决方案:
1如果打印机驱动程序中墨水设置为&黑色&,可修改设置,设置为&彩色&。如果介质设置与实际使用的打印介质不符,可修改驱动程序中的打印介质设置,或更换匹配的打印介质。
2 模式设置的确会影响驱动程序中其他许多设置,中间色调设置确定打印机是按何种方式将墨滴喷到打印介质上,如果设置不当会引起色彩偏差。调整中间色调和模式选择使之与文件类型相符。
3 如果打印头已脏,个别喷孔不出墨,可清洗打印头排除故障。
4检查墨盒,看是否墨盒墨水量低,一种或多种色彩的墨水已空,确定是否需要更换墨盒。
5应用软件或打印机驱动程序中的颜色设置需要调整。由于显示器和打印机使用不同的技术来表现色彩,即RGB模式和YMCK模式,因此实际打印的颜色无法完全与显示器上所表现的色彩匹配。可以通过调整打印机驱动程序和使用的应用软件中的多种色彩设置来解决。因为打印机使用YMCK模式管理色彩,因此使用RGB模式打印时,会造成图像色彩完全失真,因此应注意色彩模式的设置。
33.打印出的页面整版色淡
问:我使用的是激光打印机,但最近打印出的页面整版色彩偏淡,这是什么原因?
答:造成这种故障现象的原因有以下几种:
1墨粉盒内已无足够的墨粉。遇到这种情况可检查墨粉盒内的墨粉量,若已接近用完应更换墨粉盒或添加墨粉。 墨粉充足,但浓度调节过淡。遇到这种情况应重新调节墨粉浓度,使其浓淡适宜。
2感光鼓的感光强度不够。重新调节感光强度,使感光充足。
3 感光鼓加热器工作状态不良。检查感光鼓加热器工作状态,确保其工作良好。
4 高压电极丝漏电,充电电压低。检查高压电极丝有无与固定架相接等漏电现象,若有应予以绝缘处理。转印电晕器安装位置有变。检查转印电晕器安装位置是否发生改变,若已改变应将位置调整好,确保转印电压足够。
34.打印时漏墨
问:一台打印机在打印时,经常会出现漏墨的现象,请问这是什么原因?
答:打印机漏墨可能是因为以下原因造成的:
1 打印机没有放平稳,使出墨嘴不能与吸墨管道完全吻合。
2 更换墨盒时,用利器将墨嘴刺穿时可能将橡胶嘴刺破,使墨盒落机后不能完全
咬合打印机吸墨管道,墨水就会从裂缝 渗漏。打印时纸张没有正确放置或纸张没有被卷入就开始打印,使墨水打印在纸张之外,打印下一张图像时粘满墨水,导致漏墨假象。
遇到这样的问题,可通过以下方法解决:
1将打印机放平,取出墨盒重新装上。
将墨盒取出,按正确使用方法更换墨盒即可。
打印前应确定打印纸已放好。
【编辑推荐】
【责任编辑: TEL:(010)】
大家都在看猜你喜欢
关注调查聚焦关注热点
24H热文一周话题本月最赞
讲师:92154人学习过
讲师:14994人学习过
讲师:16340人学习过
精选博文论坛热帖下载排行
本书主要以“网管员的成长经历”为线索展开,虚拟出一个“新手”网管员的工作和学习环境,将网管员的成长分为4个阶段,以“网管入职充电→...
订阅51CTO邮刊思想有多远,我们就能走多远
C++异常以及错误处理
计算机应用程序中离不开错误处理,尤其是生产型大型软件系统。应用软件系统运行属于循环处理事务,出错后需要保证不能让软件程序直接退出。这就需要使用一定的程序容错处理来应对。一般情况下,大型软件开发中的软件系统容错处理会结合异常处理、错误代码定义的使用与相应的出错处理日志记录,包括一定的参与大型生产系统的监控系统等配合保障系统的稳定性。下面本章将会就软件系统中提供的异常处理作详细的讲述,包括基本概念以及应用操作情况。
软件应用程序中,异常处理机制是一种比较有效的处理系统运行时错误的方法。针对异常处理提供了一种标准的方法,用于处理软件程序运行时的错误,并用于处理软件系统中可预知或不可预知的问题。这样就可以保证软件系统运行的稳定性与健壮性。
中异常的处理主要用于针对程序在运行时刻出现错误而提供的语言层面的保护机制。它允许开发者最大限度地发挥,针对异常处理进行相应的修改调整。
应用程序中在考虑异常设计时,并不是所有的程序模块处理都需要附加上异常情况的处理。相对来说,异常处理没有普通方法函数调用速度快。过度的错误处理会影响应用程序运行的效率。通常在开发的软件系统中,应用程序都由对应的库、组件以及运行的具体不同模块组成。在设计时,异常的处理应充分考虑到独立程序库以及组件之间的情况。便于使用者在程序出现异常情况下,使用库或者组件的开发者能够快速定位出库、组件还是应用程序的错误。
由于大型软件系统中库与组件通常都是以独立的程序方式提供给具体设计开发模块人员。开发人员通常不了解组件与库中具体实现情况,只是根据提供的接口来操作使用。在不清楚具体库与组件的具体实现情况下,开发者可能在极端的情况下操作应用库或者组件提供的方法。此时相应的异常处理通信就会成为必不可少的错误处理通信机制。下面将会就语言提供的异常机制支持作详细应用讲述,在实践中总结异常应用的场合与具体实现方法。
语言异常部分的支持也是在后续语言发展中逐步讨论并添加的内容。该语言针对异常处理提供了一系列的语法支持。语言除了提供异常的关键字语法支持以外,其标准库中支持异常处理而封装异常类也很好的为应用程序中异常处理判断使用提供直接的帮助。
C++异常处理:try、throw与catch
语言中针对异常处理提供了三个关键字,分别为、与。应用程序中通过这三个关键字实现机制组合来实现异常的处理。下面通过常见异常处理操作方式来介绍应用程序中使用异常处理关键字的基本方式,其基本语法定义如下所示。
//可能出错产生异常的代码
throwtypen();
}catch(type1)
//对应类型的异常处理代码
}catch(type2)
//对应类型的异常处理代码
//更多类型异常处理代码
function();//调用可能会抛出异常的函数方法
}catch(type1)
//对应类型的异常处理代码
}catch(type2)
//对应类型的异常处理代码
应用程序中,关键字后的代码块中通常放入可能出现异常的代码。随后的块则可以是一个或者多个;块主要用于异常对应类型的处理。块中代码出现异常可能会对应多种异常处理情况,关键字后的圆括号中则包含着对应类型的参数。
块中代码体作为应用程序遵循正常流程执行。一旦该代码体中出现异常操作,会根据操作的判断抛出对应的异常类型。随后逐步的遍历代码块,此步骤与控制结构有点相像。当遍历到对应类型块时,代码会跳转到对应的异常处理中执行。如果块中代码没有抛出异常,则程序继续执行下去。
体中可以直接抛出异常,或者在体中调用的函数体中间接的抛出。下面将会通过一个简单的异常处理实例,来使用语言中支持的异常处理方式。
1.准备实例
打开工具,创建新的空文件,并且另存为。该代码文件随后会同文件一起通过工具传输至服务器端,客户端通过工具访问操作。程序代码文件编辑如下所示。
* 实例chapter1401
* 源文件chapter1401.cpp
* 简单异常处理
#include &iostream&
#include &string&
int main()
int value1,value2; //定义两个整型变量
cout&&"Pleaseinput two value:"&& //提示输入信息
cin&&value1&&value2; //从键盘输入两个整型数
cout&&"Maybeexception code:"&& //提示可能出现异常的代码信息
if(value2== 0)
//如果除数为0则抛出异常
else //否则直接计算相除操作
cout&&"value1/value2:"&&(value1/value2)&&
}catch(int i) //捕捉参数为整型的异常
cout&&"divisoris 0!"&& //异常处理代码
本实例程序主要通过方式来捕获异常,演示简单容错处理的一般实现方法。程序主要在函数内部定义实现,具体程序剖析见程序注释与后面讲解。
2.编辑makefile
平台下需要编译源文件为,相关工程文件编译命令编辑如下所示。
OBJECTS=chapter1401.o
chapter1401: $(OBJECTS)
$(CC)$(OBJECTS) -g -o chapter1401
rm-f chapter1401 core $(OBJECTS)
cp-f -r chapter1401 ../bin
cp-f -r *.h ../include
上述文件套用前面的模板格式,主要替换了代码文件、程序编译中间文件、可执行程序等。在编译命令部分选项的加入,表明程序编译同时加入了可调式信息。
3.编译运行程序
当前下执行命令,生成可执行程序文件。随后,通过命令提交程序文件至本实例目录。通过命令定位至实例目录,执行该程序文件运行,结果如下所示。
[developer@localhost src]$ make
-c-o chapter1401.o chapter1401.cpp
g++ chapter1401.o -g -o chapter1401
[developer @localhost src]$ make submit
cp -f -r chapter1401 ../bin
cp -f -r *.h ../include
[developer @localhost src]$ cd ../bin
[developer @localhost bin]$ ./chapter1401
Please input two value:
Maybe exception code:
divisor is 0!
本实例中主要演示了除法中除数为时抛出相应的异常,并作出对应的处理。本实例中块中主要放置着可能出现异常的代码。该代码块中首先定义两个整型变量与。随后提示从键盘输入两个整型数,接着输出可能出现异常的提示信息。最后判断输入的除数是否为。如果该判断条件成立,即程序执行中发生了除数为的错误,则对应的代码体中使用抛出异常。如果判断条件不成立,则程序继续执行下去,
一旦符合抛出异常条件成立,则执行相应代码采用关键字抛出异常。此时关键字后跟着一个整型数表示该异常。随后语句块捕捉异常,由于随后的参数类型符合抛出异常的类型匹配则执行中的异常处理,即打印输出除数为的提示信息。在主程序中块中抛出的异常的类型需要与随后的中参数类型一致,否则会程序将会异常终止。初学者可以将上述中参数类型修改为类型测试看看当前编译器针对异常发生后匹配不到对应的时给出的反应。
如果块中的代码没有抛出异常,则程序会直接忽略随后的块,直接执行后续的代码处理。在设计程序可能出现的异常处理时,将抛出异常的类型与对应的块中的类型规范的对应起来有助于程序在异常处理加入后更加清晰有条理。
throw抛出异常处理
程序中异常抛出是采用关键字实现的。通常关键字后会跟随着一个操作数,该操作数可以是一个表达式、一个内置类型数据或者为类类型的对象等。最常见的异常抛出都会放在代码块中。当然,也允许抛出异常的地方在函数中供块中的代码调用。正常情况下异常抛出点的定义不要放在块外部无关的地方,因为那样通常会引起编译器默认的终止程序处理。最好的情况下,异常抛出点直接或者间接的定义在块中。
块中可以包含一个或者多个异常抛出点。但是需要注意的是,异常只要一抛出,对应的块捕捉到后,该块中以下的代码体执行会被终止。代码执行直接进入对应的块中,最后块执行处理完异常后直接跳转至所有当前块对应的块之后。
下面通过一个具体的实例来演示异常抛出的基本操作与需要注意的使用情况。
1.准备实例
打开工具,创建新的空文件并且另存为。该代码文件随后会同文件一起通过工具传输至服务器端,客户端通过工具访问操作。程序代码文件编辑如下所示。
* 实例chapter1402
* 源文件chapter1402.cpp
* 简单异常处理
#include &iostream&
#include &string&
void divideCompute(int value1,int value2) //除法计算函数定义
if(value1 == 0) //如果被除数为0,则抛出参数类型为浮点型异常
throw 0.0;
else if(value2 == 0) //如果除数为0,则抛出参数类型为整型异常
else //否则执行除法运算并打印输出结果
cout&&"value1/value2:"&&(value1/value2)&&
int main()
int value1,value2; //定义两个整型变量
cout&&"Pleaseinput two value:"&& //提示输入两个整型数信息
cin&&value1&&value2; //输入两个整型数
cout&&"Maybeexception code:"&&
divideCompute(value1,value2); //调用除法计算函数,传入两个输入的整型参数
}catch(int i) //捕捉整型参数异常
cout&&"divisoris 0!"&& //对应的异常处理
}catch(double i) //捕捉浮点型参数异常
cout&&"dividendis 0!"&& //对应的异常处理
cout&&"here!"&& //异常处理块后的正常代码
本实例通过关键字演示在函数内部抛出异常,程序调用处捕获异常并处理的场景。程序主要由函数与主函数组成,具体程序剖析见程序注释与后面讲解。
2.编辑makefile
平台下需要编译源文件为,相关工程文件编译命令编辑如下所示。
OBJECTS=chapter1402.o
chapter1402: $(OBJECTS)
$(CC)$(OBJECTS) -g -o chapter1402
rm-f chapter1402 core $(OBJECTS)
cp-f -r chapter1402 ../bin
cp-f -r *.h ../include
上述文件套用前面的模板格式,主要替换了代码文件、程序编译中间文件、可执行程序等。在编译命令部分选项的加入,表明程序编译同时加入了可调式信息。
3.编译运行程序
当前下执行命令,生成可执行程序文件。随后通过命令提交程序文件至本实例目录。通过命令定位至实例目录,执行该程序文件运行结果如下所示。
[developer@localhost src]$ make
-c-o chapter1402.o chapter1402.cpp
g++ chapter1402.o -g -o chapter1402
[developer @localhost src]$ make submit
cp -f -r chapter1402 ../bin
cp -f -r *.h ../include
[developer @localhost src]$ cd ../bin
[developer @localhost bin]$ ./chapter1402
Please input two value:
Maybe exception code:
dividend is 0!
本实例中主要设计了除法中可能出现的异常。此处抛出异常没有直接放在代码块中,而是通过间接的方式放置在函数定义中,供代码块中调用。此时除法操作定义的函数中包含着可能出现的两个异常抛出点。一类是针对被除数为时,抛出浮点型参数异常。另一类则针对除数为时,抛出整型参数异常。
整个主程序代码中主要有两个参数类型的捕获处理。分别对应着除数以及被除数为时异常抛出捕获处理。上述实例表明代码块中可以直接放置或者间接放置多个异常抛出点。一旦其中一个异常点抛出后程序控制权将会转移到对应的参数类型异常处理中。对应的异常处理完后将会意味着程序执行将会终止异常块中的程序块。直接转移到对应的所有异常处理块之后的代码执行。
上述主程序中从块中开始执行,代码快中首先定义两个整型变量与。随后提示从键盘输入两个整型数,上述程序执行后输入两个整型数都为。之后将输入的两个整型数作为除法计算函数的实参调用除法计算函数。根据传入的实参首先判断被除数为则抛出浮点型参数异常,随后程序转移到对应块中执行异常处理,输出提示信息“”。程序代码转移至处理块中之后,则退出了异常抛出的所在块。直接处理完毕后,转到所有块之后继续执行代码,即最后执行输出“”提示信息代码。
catch捕捉异常处理
关键字的代码块则主要负责异常的捕获处理,块可以拥有多个,并且紧跟着块之后。每个块部分主要由圆括号中参数类型,紧跟其后的大括号中异常代码处理部分构成。前面小节在讲述异常抛出处理时已经对其使用的原理作过解释,即当在可能抛出异常的代码块中通过抛出了异常。随后开始匹配块中的参数类型是否符合异常抛出时的类型,如果符合则执行对应块中的代码处理。
多个块中,遍历到对应的块则执行随后代码块处理异常。块中随后圆括号中参数类型,该类型可以拥有变量名称或者对象名称,也可以直接是对应的参数类型。如果是对应的类型对象,则在块中可以引用该对象处理。而如果是只有数据类型没有相应参数名称的参数,则直接匹配对应的参数类型即可,程序会从块中转移至块中执行。
如果异常抛出了,匹配对应的块没有对应类型的异常处理时,则会调用默认的异常来终止程序的执行。块中的参数除了采用基本的内置类型、自定义类类型外,还可以使用三个点的省略号(即)来表示捕捉所有的异常。此时,当块中一旦抛出异常时,如果对应的块中只有一个或者对应的放置在所有其它块最后。那么,异常发生时只会执行对应的中的代码处理,或者当前面所有的都匹配不到时,则匹配捕获所有异常处理。通常情况下捕捉所有异常的定义会放在所有其它块最后位置,这样的好处就是程序不会因为抛出异常匹配不到对应的块而终止。
上述实例代码作出如下修改,根据实例中添加块观察捕捉异常处理情况。
1.准备实例
打开工具,创建新的空文件并且另存为。该代码文件随后会同文件一起通过工具传输至服务器端,客户端通过工具访问操作。程序代码文件编辑如下所示。
* 实例chapter1403
* 源文件chapter1403.cpp
* 捕获所有异常处理
#include &iostream&
#include &string&
void divideCompute(int value1,int value2) //除法计算函数定义
if(value2 == 0) //如果除数为0,则抛出相应的整型异常
else //否则计算除法运算,并打印结果
cout&&"value1/value2:"&&(value1/value2)&&
int main()
int value1,value2; //定义两个整型变量
cout&&"Pleaseinput two value:"&&
cin&&value1&&value2; //从键盘输入两个整型值
cout&&"Maybeexception code:"&&
divideCompute(value1,value2); //调用除法计算函数
}catch(double i) //对应浮点型参数异常处理
cout&&"doubleexception!"&&
}catch(int i) //对应整型参数异常处理
cout&&"divisoris "&&i&&”!”&&
}catch(...) //捕获所有异常处理
cout&&"allexception!"&&
cout&&"here!"&&
本实例主要通过方式使用演示在异常处理相关类型捕获不到的情况下,异常的默认处理情况。程序主要由函数与主函数组成,程序具体剖析见程序注释与后面程序讲解。
2.编辑makefile
平台下需要编译源文件为,相关工程文件编译命令编辑如下所示。
OBJECTS=chapter1403.o
chapter1403: $(OBJECTS)
$(CC)$(OBJECTS) -g -o chapter1403
rm-f chapter1403 core $(OBJECTS)
cp-f -r chapter1403 ../bin
cp-f -r *.h ../include
上述文件套用前面的模板格式,主要替换了代码文件、程序编译中间文件、可执行程序等。在编译命令部分选项的加入,表明程序编译同时加入了可调式信息。
3.编译运行程序
当前下执行命令,生成可执行程序文件,随后通过命令提交程序文件至本实例目录,通过命令定位至实例目录,执行该程序文件运行结果如下所示。
[developer@localhost src]$ make
-c-o chapter1403.o chapter1403.cpp
g++ chapter1403.o -g -o chapter1403
[developer @localhost src]$ make submit
cp -f -r chapter1403 ../bin
cp -f -r *.h ../include
[developer @localhost src]$ cd ../bin
[developer @localhost bin]$ ./chapter1403
Please input two value:
Maybe exception code:
divisor is 0!
上述实例中,主程序中根据输入的实参整型数调用除法计算函数。在除法计算函数中,一旦除数为,则抛出整型参数为的异常。此时开始匹配块对应后的块中的参数类型。首先对比第一个块,由于其参数类型为类型不符合类型匹配,则继续向下搜索。块后的第二个捕捉异常处理块中的参数类型为整型,并且该参数还拥有参数类型对应变量。匹配到该块后,程序转移到对应的代码块中处理,该代码块中主要用于打印输出说明除数为,此时则直接引用了参数类型后的变量名。
主程序中上述匹配到的块执行完之后直接转移至所有块之后继续执行。执行最后打印输出语句。此时如果前面几个都没有匹配对应的参数类型时,则块中异常处理代码会被执行,初学者可以自行修改程序进行测试学习。
throw重抛异常处理
重新抛出异常通常应用在嵌套层中。最常见的应用即当前块中捕捉异常块不作任何处理时,可以通过重抛异常让层外部的块来处理。如果层外部已经没有对应的与块处理,则会调用默认的异常处理终止程序。下面将会通过一个完整实例来演示异常重抛的应用情况。
1.准备实例
打开工具,创建新的空文件并且另存为。该代码文件随后会同文件一起通过工具传输至服务器端,客户端通过工具访问操作。程序代码文件编辑如下所示。
* 实例chapter1404
* 源文件chapter1404.cpp
* throw重抛异常处理
#include &iostream&
#include &string&
void divideCompute(int value1,int value2)
if(value2 == 0) //如果除数为0,则抛出异常
throw 0; //抛出整型异常
else //否则计算除法运算
cout&&"value1/value2:"&&(value1/value2)&&
}catch(double i) //捕捉浮点型参数异常
cout&&"doubleexception!"&&
}catch(int i) //捕捉整型参数异常
cout&&"rethrowexception:"&&
//重抛异常
}catch(...) //捕捉所有类型异常
cout&&"allexception!"&&
int main()
int value1,value2; //定义两个整型变量
cout&&"Pleaseinput two value:"&&
cin&&value1&&value2;
//输入两个整型变量
cout&&"Maybeexception code:"&&
divideCompute(value1,value2);
//调用除法计算函数
}catch(double i) //外层捕捉浮点型异常
cout&&"doubleexception!"&&
}catch(int i) //外层捕捉整型异常
cout&&"divisoris "&&i&&"!"&&
}catch(...) //外层捕捉所有类型异常
cout&&"allexception!"&&
cout&&"here!"&&
本实例程序主要演示嵌套使用中,通过关键字重新抛出异常的功能。程序主要由函数与主函数组成,程序具体剖析见程序注释与后面讲解。
2.编辑makefile
平台下需要编译源文件为,相关工程文件编译命令编辑如下所示。
OBJECTS=chapter1404.o
chapter1404: $(OBJECTS)
$(CC)$(OBJECTS) -g -o chapter1404
rm-f chapter1404 core $(OBJECTS)
cp-f -r chapter1404 ../bin
cp-f -r *.h ../include
上述文件套用前面的模板格式,主要替换了代码文件、程序编译中间文件、可执行程序等。在编译命令部分选项的加入,表明程序编译同时加入了可调式信息。
3.编译运行程序
当前下执行命令,生成可执行程序文件。随后通过命令提交程序文件至本实例目录。通过命令定位至实例目录,执行该程序文件运行结果如下所示。
[developer@localhost src]$ make
g++ -c -o chapter1404.o chapter1404.cpp
g++ chapter1404.o -g -o chapter1404
[developer@localhost src]$ make submit
cp -f -r chapter1404 ../bin
cp -f -r *.h ../include
[developer@localhost src]$ cd ../bin
[developer@localhost bin]$ ./chapter1404
Please input two value:
Maybe exception code:
rethrow exception:
divisor is 0!
本实例中主要演示了块中调用除法计算方法。该方法中又存在与块的嵌套处理情况。上述实例主程序中同样是定义两个整型变量与,随后从键盘输入两个整型数作为实参调用除法计算函数。除法计算函数中仍然包含着块,块中包含着可能抛出异常的代码。一旦输入的实参中除数为则报出整型类型的异常,被随后的整型参数块所捕获执行相对应的异常处理代码。
在对应的异常处理块中允许针对异常不作出任何的处理,而直接使用不带任何的参数类型重新抛出异常,交由外层的块来捕获。此时代码执行被转移至外层块进行匹配。如果匹配到整型类型的异常处理时,则进入执行相应的异常处理。如果没有匹配到则执行块捕获所有异常,随后转移至块外继续执行。
上述实例程序执行时传入两个整型数和。由于除数为则在除法函数体中块抛出异常。此时最内一层开始进行捕获匹配,匹配到整型参数类型异常处理则进入执行。最内层的整型参数中除了打印输出提示重抛异常信息外,则执行重抛异常。被外层对应的块捕获进入执行相应异常处理,通过直接引用捕获异常参数类型的变量打印除数为的信息提示。
中异常机制同样可以应用于自定义类类型。在程序中,大部分的异常处理都是应用于自定义类类型。通常情况下定义处理异常的类,然后再创建一个专门用于描述对应异常错误的对象实例。最后在应用程序中利用这个异常类对象实例处理应用的代码中可能发生的异常错误。
类类型中异常基本应用
类体系中异常的处理情况其实与函数中大致相仿。但由于自定义类型加入了封装、继承等特性,其异常处理变得稍微复杂。通常情况下,大型的软件系统中往往会自定义异常类,供其它模块程序包含使用。下面将讲解一个自定义异常类以及在类中使用该异常类的实例,读者可以了解异常在类体系中的应用情况与需要注意的问题。
1.准备实例
打开工具,创建新的空文件并且另存为、与。该代码文件随后会同文件一起通过工具传输至服务器端,客户端通过工具访问操作。程序代码文件编辑如下所示。
* 实例chapter1405
* 源文件chapter1405_01.h chapter1405_02.h chapter1405_02.cpp
* 异常类的封装
#ifndef EXCEPTION_H_
#define EXCEPTION_H_
#include &iostream&
#include &string&
//自定义异常类
class MyException
//异常类无参数默认构造函数定义
MyException()
m_context= "";
//初始化异常信息数据成员为空
//异常类空析构函数定义
~MyException(){}
//异常类字符串类型参数构造函数定义
MyException(const string & right)
m_context=
//初始化异常信息数据为字符串对象参数
//异常类字符串指针类型参数构造函数定义
MyException(const char * right)
m_context=
//初始化异常信息数据为字符串指针参数
//异常类返回异常信息接口方法定义
string what() const
//直接返回相应的异常信息数据成员
//字符串类型数据成员,表示异常信息
//异常测试类,除法计算类头文件chapter1405_02.h
#include "chapter1405_01.h"
//自定义除法计算类
class Compute
Compute(intvalue1,int value2); //除法计算类构造函数,两个整型参数列表
~Compute(){}
//除法计算类空析构函数定义
voiddivideCompute();
//除法计算类除法计算方法成员
int m_value1; //除法计算类数据成员,表示被除数
int m_value2; //除法计算类数据成员,表示除数
//异常测试类,除法计算类源文件chapter1405_02.cpp
#include "chapter1405_02.h"
Compute::Compute(int value1,int value2)
//除法计算类构造函数定义
m_value1 = value1;
//初始化被除数数据成员
m_value2 = value2;
//初始化除数数据成员
void Compute::divideCompute()
//除法类除法计算方法成员定义
if(m_value2 == 0)
//如果除数为0,则抛出相应异常
throwMyException("divisor is 0!");
//否则计算两数相除,并打印结果
cout&&"m_value1/m_value2:"&&(m_value1/m_value2)&&
}catch(MyException&e)
//捕获对应异常类型
stringerrorMessage = e.what();
//定义错误信息字符串对象,获取对应异常信息
cout&&errorMessage&&
//打印输出对应的异常信息
}catch(...)
//捕获所有异常
stringerrorMessage = "Don’t knowerror!";
//捕获所有异常处理信息
cout&&errorMessage&&
int main()
int value1,value2;
//定义两个整型变量
cout&&"Pleaseinput two value:"&& //提述输入两个整型数据
cin&&value1&&value2;
//从键盘输入两个整型数
Computecompute(value1, value2);
//定义计算类对象,同时传入输入的两个整型数构造初始化
compute.divideCompute();
//计算类对象调用其除法计算方法
本实例通过封装异常处理类类型,演示异常处理在应用程序中的使用方法。程序主要由异常类、程序计算类以及主函数组成,具体剖析见程序注释与后面讲解。
2.编辑makefile
平台下需要编译源文件为,相关工程文件编译命令编辑如下所示。
OBJECTS=chapter1405_02.o
chapter1405_02: $(OBJECTS)
$(CC)$(OBJECTS) -g -o chapter1405_02
rm-f chapter1405_02 core $(OBJECTS)
cp-f -r chapter1405_02 ../bin
cp-f -r *.h ../include
上述文件套用前面的模板格式,主要替换了代码文件、程序编译中间文件、可执行程序等。在编译命令部分选项的加入,表明程序编译同时加入了可调式信息。
3.编译运行程序
当前下执行命令,生成可执行程序文件,随后通过命令提交程序文件至本实例目录,通过命令定位至实例目录,执行该程序文件运行结果如下所示。
[developer@localhost src]$ make
-c-o chapter1405_02.o chapter1405_02.cpp
g++ chapter1405_02.o -g -o chapter1405_02
[developer@localhost src]$ make submit
cp -f -r chapter1405_02 ../bin
cp -f -r *.h ../include
[developer@localhostsrc]$ cd ../bin
[developer@localhostbin]$ ./chapter1405_02
Please input two value:
divisor is 0!
上述实例中主要演示了异常机制在面向对象类类型中的应用情况。功能与前面除数为的实例相仿。本实例中首先定义异常类。该类主要用于用于异常抛出和捕捉时的对象类型。异常类中主要包含成员:四个不同类型的构函数、一个获取异常信息的方法成员、一个私有保护型的数据成员用于表示异常信息内容。
类中个构造函数,第一个为无参数默认构造定义,将异常信息内容初始化为空。第二个则参数为型的对象构造,使用字符串初始化数据成员。第三个则参数为字符串指针的对象构造,使用字符串指针初始化异常数据成员。异常类中的方法成员中主要返回异常信息,用于在应用程序中捕获并打印输出。
计算类主要用于两数除法运算。该类中主要包含一个构造函数、一个空析构函数以及一个计算两个数除法的方法。另外,它包含两个整型的数据成员分别表示除法中的两个数。该类的构造函数中主要通过传入的两个整型参数初始化对应的数据成员,计算除法的方法实现与前面的除法计算实例相同,仅仅是抛出的异常类型为。另外捕捉异常块中应用了异常类型对象实例调用其方法获取对应的异常信息并赋值最后输出。
主程序中从键盘输入两个整型数,分别为和。定义类对象实例,通过实参初始化计算类数据成员,随后调用其除法计算方法。除法计算方法中由于除数为,则抛出自定义异常类型同时传入异常错误信息,随后块中捕获到对应类型异常,内部则调用自定义异常类中方法获取异常出错信息,最后打印输出。
异常类的继承处理
异常机制在继承体系中依然可以很好的运用。最重要的是利用类继承体系与对应的虚拟方法实现异常的多态性。通过自定义异常类派生新的异常类,除了包含基类基本异常处理方法,还可以包含自定义添加新的异常处理方式。下面将会在上述实例中添加异常派生类。新的异常派生类不仅仅可以在异常处抛出对应的错误信息,还可以支持错误代码及对应的信息。
* 实例chapter1406
* 源文件chapter1406_01.h
* 异常继承类的封装
//异常处理类源文件chapter1406_01.h
#ifndef EXCEPTION_H_
#define EXCEPTION_H_
#include &iostream&
#include &string&
//自定义异常类
class MyException
MyException()
//自定义异常类构造函数定义
m_context= "";
//初始化类异常信息数据成员为空
virtual~MyException(){}
//异常类析构函数定义
MyException(const string & right)
//异常类构造函数定义,通过传入字符串型参数初始化
m_context=
MyException(const char * right)
//异常类构造函数定义,通过传入字符串指针参数初始化
m_context=
virtualstring what() const
//异常类中虚拟what接口方法定义,获取异常信息
protected:
//异常类保护型数据成员,表示异常信息内容
//异常派生类,加入错误代码处理
class code_MyException : public MyException
code_MyException(interror_code, string error_code_msg = "", string context ="")//异常派生类构造
m_errorCode= error_
//错误代码初始化
m_errorCodeMsg= error_code_
//错误代码对应消息初始化
m_context=
//对应异常信息初始化
stringwhat() const
//派生类what接口重定义
chartmp[20];
//定义临时字符数组
sprintf(tmp,"%d", m_errorCode);
//格式化错误代码
returnstring(tmp) + "," + m_errorCodeMsg + "," + m_
//返回连接的错误信息
intgetErrorCode() const
//获取错误代码
returnm_errorC
stringgetErrorCodeMsg() const
//获取错误代码对应信息
returnm_errorCodeM
protected:
m_errorC //错误代码
m_errorCodeM
//错误信息
上述实例中在原来异常类的基础之上派生了新的异常处理类,其中增加了错误代码以及错误信息的功能。利用继承机制,同时将其中的析构方法以及接口定义为虚拟函数,有助于统一接口的实现。封装实现的异常处理类可以将其编译为库,作为系统中统一的组件供程序来使用。该实例的实际应用以及测试由初学者按照前面实例的方式来实践操作,从中领悟多态以及异常处理的好处。
标准库提供异常处理类
标准库同样对异常作出了封装实现。标准库中异常实现也采用类继承层次式的结构。库中针对异常处理提供了一个层次化的类结构。该类层次中顶层基类为,即针对其它不同情况下的异常处理类都派生自类。
针对异常处理,总共提供了八个标准异常处理。其中,四个针对语言级提供的抛出异常,分别为、、以及;另外四个为标准库抛出的异常,分别是、、以及。下面将会针对这八类抛出异常情况作详细的讲述,分别说明每类异常表达的意义及基本用法。
1. bad_alloc
针对中动态存储分配的操作提供的异常信号,主要针对分配内存空间时内存耗尽(分配不足)时抛出的异常。这种异常的抛出有利于开发者在实际应用中针对操作分配内存时提供某种分配出错的处理方式。下面可以通过一个基本小代码片段来理解异常处理情况。
void newChar()
newchar[00];
//通过new开辟一个超大的内存空间
}catch(bad_alloc)
cout&&”memoryerror!”&&
上述代码动态了一个很大的内容空间,当本地计算机内存不足时会默认抛出异常。随后捕捉到该异常后进入对应的异常处理块中。
2.bad_cast
多态提供的应用于指针类型时,通常需要考虑指针各类异常的情况。这时,可以显式的去判断处理。但是当应用于引用时,即表示引用的类型为,如果引用的不是对应类型的对象,则将会默认隐式的作断言检查。这时就会抛出异常,供捕获检测处理。
3. bad_typeid
是针对操作空指针抛出的异常。
4. bad_exception
当应用程序出现了无法捕获的异常情况时,通常会调用终止程序。而使用时,出现类似情况则会抛出异常,用来替代终止程序。
异常处理则主要针对应用提出的。这些类同样从类派生而来。表示操作数组等结构下标时,访问超过设定范围所抛出的异常。它主要针对容器中方法与重载的下标访问运算符两类方法。则表示向函数传递无效参数时抛出的异常,开发者可以针对该类抛出的异常作出相应的处理。表示运算时候发生的上溢情况抛出的异常。则是针对输出输入流操作时抛出的异常。
标准库中异常处理的封装可以通过查阅相关标准文档,根据提供的相关处理接口在实际的应用程序中使用。实际的基类中除了基本的构造函数外,重载实现一些运算符操作。最重要的是其接口的定义,该方法定义为虚拟方法供其派生类中改写增加更多的异常处理。
应用程序错误处理
应用软件系统开发中,通常情况下可以通过实现错误处理类来记录程序启动以及处理中可能出现的错误情况。错误处理采用自定义类类型来实现,除了起到异常处理的补充作用以外对于程序中必不可少的异常容错处理来讲,错误处理相对效率较高些。下面本小节主要通过自定义实现一个错误处理类的实例,详细讲述软件应用程序中针对错误处理的另外一种错误信息提示方式。
1.准备实例
打开工具,创建新的空文件并另存为、、。该代码文件随后会同文件一起通过工具传输至服务器端,客户端通过工具访问操作。程序代码文件编辑如下所示。
//错误处理类头文件chapter1407_01.h
#ifndef ERRORHANDLE_H_
#define ERRORHANDLE_H_
#include &iostream&
#include &string&
#include &deque&
const int ERRORMSG_LEN = 300;
//错误信息长度常量定义
class ErrorInfo
//错误信息类
ErrorInfo(){}
//错误信息空构造函数定义
~ErrorInfo(){}
//错误信息空析构函数定义
ErrorInfo(constErrorInfo& errorinfo);
//错误信息类拷贝构造
intm_errorNo; //错误信息类数据成员,表示错误代码
charm_message[ERRORMSG_LEN+1];
//错误信息类数据成员,表示错误信息
class ErrorMessages
//错误消息容器类
voidsetProgramInfo(const string& programInfoName);
//错误消息容器类设置应用程序信息方法
stringgetProgramInfo();
//错误消息容器类获取应用程序信息方法
voidinsert(ErrorInfo &errInfo);
//错误消息容器类插入错误信息方法
boolget(ErrorInfo& errInfo);
//错误信息容器类获取错误信息方法
voidclean();
//清空错误消息队列方法
boolisEmpty();
//判断错误消息队列是否为空
voidinsert(const int errorCode, const string& errorMessage);
//重载插入错误信息方法
voidinsert(const int errorCode, const char *errorMessage);
//重载插入错误信息方法
stringm_programInfoN
//错误消息类数据成员,表示应用程序名
deque&ErrorInfo&m_errorInfoQ //错误消息类数据成员,表述错误信息队列
//错误处理类源文件chapter1407_01.cpp
#include "chapter1407_01.h"
ErrorInfo::ErrorInfo(const ErrorInfo&errorinfo)
//错误信息类拷贝构造定义
m_errorNo= errorinfo.m_errorNo;
//拷贝传入错误信息类对象的成员
strcpy(m_message,errorinfo.m_message);
void ErrorMessages::setProgramInfo(conststring& programInfoName)
//设置应用程序信息方法定义
m_programInfoName= programInfoN
//根据传入的程序名设置
string ErrorMessages::getProgramInfo()
//获取应用程序信息
returnm_programInfoN
//返回应用程序名称信息
void ErrorMessages::insert(ErrorInfo&errorinfo)
//插入错误信息方法定义
m_errorInfoQueue.push_back(errorinfo);
//将传入的错误信息类对象放入错误信息队列
void ErrorMessages::insert(const int errorCode,const string& errorMessage)//重载插入错误信息方法定义
//定义错误信息类对象实例
errorinfo.m_errorNo= errorC
//将传入的错误代码赋值给该对象中数据成员
if(errorMessage.length() &= ERRORMSG_LEN)
//如果传入的错误信息长度在规定之内
strcpy(errorinfo.m_message,errorMessage.c_str());
//则将错误信息拷贝到该对象对应数据成员中
//否则扩充长度后再拷贝
strncpy(errorinfo.m_message,errorMessage.c_str(), ERRORMSG_LEN);
errorinfo.m_message[ERRORMSG_LEN]= 0;
insert(errorinfo);
//最后插入到错误消息队列中
void ErrorMessages::insert(const int errorCode,const char *errorMessage)//插入错误信息重载方法定义
//定义错误信息类对象
errorinfo.m_errorNo= errorC
//同上一方法定义
if(strlen(errorMessage) &= ERRORMSG_LEN)
strcpy(errorinfo.m_message,errorMessage);
strncpy(errorinfo.m_message,errorMessage, ERRORMSG_LEN);
errorinfo.m_message[ERRORMSG_LEN]= 0;
insert(errorinfo);
bool ErrorMessages::get(ErrorInfo& errorinfo)
//获取错误信息队列中的信息
if(m_errorInfoQueue.empty())
//如果错误信息队列为空,则直接返回false
errorinfo= m_errorInfoQueue.front();
//返回队列中头部的数据
m_errorInfoQueue.pop_front();
//删除队列中头部的数据
void ErrorMessages::clean()
//清空错误信息队列
m_errorInfoQueue.clear();
//直接调用clear方法清除
bool ErrorMessages::isEmpty()
//判断错误信息是否为空
returnm_errorInfoQueue.empty();
//直接调用empty方法判断
//错误处理类测试源文件chapter1407_02.cpp
#include "chapter1407_01.h"
ErrorMessages errorM
//定义错误消息容器类对象
const int E_DIVISOR_ZERO = 200;
//定义除数为0的错误代码常量
const string E_DIVISOR_ERROR = "divisor is0!";
//定义除数为0的错误信息常量
void divideCompute(int value1,int value2)
//除法计算函数定义
if(value2== 0)
//如果除数为0,则记录相应的错误信息
errorMessages.insert(E_DIVISOR_ZERO,E_DIVISOR_ERROR);//插入对应的错误代码与错误信息
//否则计算除法并输出结果
cout&&"value1/value2:"&&(value1/value2)&&
int main(int argc,char *argv[])
//定义字符串对象name
ErrorInfoerrorI
//定义错误信息类
name= argv[0];
//获取程序名并初始化字符串name
errorMessages.setProgramInfo(name);
//调用错误信息容器类中设置程序信息方法
cout&&"Programname:"&&errorMessages.getProgramInfo()&&//打印输出该程序信息
int value1,value2;
//定义两个整型变量
cout&&"Pleaseinput two value:"&&
//提示输入两个整型参数
cin&&value1&&value2;
//从键盘输入两个整型数
divideCompute(value1,value2);
//调用计算除法运算的函数计算输入的数据
errorMessages.get(errorInfo);
//获取错误消息队列中的数据
cout&&"errorcode:"&&errorInfo.m_errorNo&&" "
&&"errormessage:"&&errorInfo.m_message&&
//打印输出对应队列中的错误信息
本实例主要通过封装程序错误处理类,演示应用程序中错误处理的一般实现方式。程序主要由错误处理类与主函数组成,程序具体剖析见程序注释与后面的讲解。
2.编辑makefile
平台下需要编译源文件为、,相关工程文件编译命令编辑如下所示。
OBJECTS=chapter1407_01.o chapter1407_02.o
chapter1407_02: $(OBJECTS)
$(CC)$(OBJECTS) -g -o chapter1407_02
chapter1407_01.o:chapter1407_01.h
chapter1407_02.o:
rm-f chapter1407_02 core $(OBJECTS)
cp-f -r chapter1407_02 ../bin
cp-f -r *.h ../include
上述文件套用前面的模板格式,主要替换了代码文件、程序编译中间文件、可执行程序等。在编译命令部分选项的加入,表明程序编译同时加入了可调式信息。
3.编译运行程序
当前下执行命令,生成可执行程序文件,随后通过命令提交程序文件至本实例目录,通过命令定位至实例目录,执行该程序文件运行结果如下所示。
[developer@localhost src]$ make
-c -ochapter1407_01.o chapter1407_01.cpp
-c -ochapter1407_02.o chapter1407_02.cpp
g++ chapter1407_01.o chapter1407_02.o -g -ochapter1407_02
[developer@localhost src]$ make submit
cp -f -r chapter1407_02 ../bin
cp -f -r *.h ../include
[developer@localhostsrc]$ cd ../bin
[developer@localhostbin]$ ./chapter1407_02
Program name:./chapter1407_02
Please input two value:
error code:200 error message:divisor is 0!
本实例中主要定义实现错误处理类。该类用于记录软件系统中自定义的错误代码与对应的错误信息,以配合异常实现应用程序相应的错误处理。上述实例中错误处理主要涉及两个类的定义:
一个为记录错误信息类。其中,主要包括相应的构造析构函数以及一个错误信息对象拷贝方法。它还包含两个公开的数据成员,用于分别表示错误代码与对应的错误信息。
另一个为错误信息容器类。该类主要用于记录并存放相应的错误处理信息,并提供相应的错误信息访问接口,以供应用程序使用。
类中主要包括八个接口方法与两个数据成员。该类的接口方法在注释中作了详细的标注。其中,这些接口中最重要为几个方法的重载实现,从而实现了不同种情况下的信息插入处理。第一个是整个结构体对象参数接口;第二个为支持错误代码与字符串类型的对象接口;最后一个为支持错误代码与字符串常量的插入信息接口。其中,还包括两个保护数据成员,分别为应用程序名称和存放错误消息的队列。该队列中存放的为错误信息类类型的数据。
主程序中则仍然主要以测试除法运算中除数为时的错误处理。首先从程序信息参数数组中获取程序名称设置并获取打印该信息。随后根据传入的两个整型数,调用对应的计算除法的运算方法。该方法中,一旦除数为,则记录对应的错误信息。最后主程序中则获取到对应的错误信息并打印输出。
上述程序中错误处理类可以放入自定义库或者组件中,供应用程序中记录错误信息使用。其中,支持错误代码以及对应的错误信息对应记录。这样做的好处是针对不同的模块设计可以规定一套错误代码以及对应信息,供整个系统使用。另外,插入的错误信息可以根据实际需求,将其记录到日志文件中,供出现错误时查询使用。
异常处理的提出为编写出更具健壮性、稳定性的应用程序提供了很好的支持。但是异常与前面介绍该语言的特性一样,不能够滥用。因为任何支持的特性总是以牺牲一定的效率来实现的。通过上述介绍,用户在实际软件系统中可以结合错误处理、异常以及对应的错误日志等,最终开发出高稳定、高容错性的应用系统。
没有更多推荐了,}

我要回帖

更多关于 log4j 打印exception 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信