通用语言运行时(CLR)具有的一个很大的优势为,异常处理是跨语言被标准化的。一个在C#中所引发的异常可以在
Visual Basic客户中得到处理。不再有 HRESULTs 或者 ISupportErrorInfo 接口。
尽管跨语言异常处理的覆盖面很广,但这一章完全集中讨论C#异常处理。你稍为改变编译器的溢出处理行为,接着有
趣的事情就开始了:你处理了该异常。要增加更多的手段,随后引发你所创建的异常。
7.1 校验(checked)和非校验(unchecked)语句
当你执行运算时,有可能会发生计算结果超出结果变量数据类型的有效范围。这种情况被称为溢出,依据不同的编程
语言,你将被以某种方式通知——或者根本就没有被通知。(C++程序员听起来熟悉吗?)
那么,C#如何处理溢出的呢? 要找出其默认行为,请看我在这本书前面提到的阶乘的例子。(为了方便其见,前面
的例子再次在清单 7.1 中给出)
清单 7.1 计算一个数的阶乘
1: using System;
2:
3: class Factorial
4: {
5: public static void Main(string[] args)
6: {
7: long nFactorial = 1;
8: long nComputeTo = Int64.Parse(args[0]);
9:
10: long nCurDig = 1;
11: for (nCurDig=1;nCurDig <= nComputeTo; nCurDig++)
12: nFactorial *= nCurDig;
13:
14: Console.WriteLine("{0}! is {1}",nComputeTo, nFactorial);
15: }
16: }
当你象这样使用命令行执行程序时
factorial 2000
结果为0,什么也没有发生。因此,设想C#默默地处理溢出情况而不明确地警告你是安全的。
通过给整个应用程序(经编译器开关)或于语句级允许溢出校验,你就可以改变这种行为。以下两节分别解决一种方
案。
7.1.1 给溢出校验设置编译器
如果你想给整个应用程序控制溢出校验,C#编译器设置选择是正是你所要找的。默认地,溢出校验是禁用的。要明确
地要求它,运行以下编译器命令:
csc factorial.cs /checked+
现在当你用2000参数执行应用程序时,CLR通知你溢出异常(见图 7.1)。
图 7.1 允许了溢出异常,阶乘代码产生了一个异常。
按OK键离开对话框揭示了异常信息:
Exception occurred: System.OverflowException
at Factorial.Main(System.String[])
现在你了解了溢出条件引发了一个 System.OverflowException异常。下一节,在我们完成语法校验之后,如何捕获并
处理所出现的异常?
7.1.2 语法溢出校验
如果你不想给整个应用程序允许溢出校验,仅给某些代码段允许校验,你可能会很舒适。对于这种场合,你可能象清
单7.2中显示的那样,使用校验语句。
清单 7.2 阶乘计算中的溢出校验
1: using System;
2:
3: class Factorial
4: {
5: public static void Main(string[] args)
6: {
7: long nFactorial = 1;
8: long nComputeTo = Int64.Parse(args[0]);
9:
10: long nCurDig = 1;
11:
12: for (nCurDig=1;nCurDig <= nComputeTo; nCurDig++)
13: checked { nFactorial *= nCurDig; }
14:
15: Console.WriteLine("{0}! is {1}",nComputeTo, nFactorial);
16: }
17: }
甚至就如你运用标志 checked-编译了该代码,在第13行中,溢出校验仍然会对乘法实现检查。错误信息保持一致。
显示相反行为的语句是非校验(unchecked )。甚至如果允许了溢出校验(给编译器加上checked+标志),被
unchecked 语句所括住的代码也将不会引发溢出异常:
用工具吧!推荐一个好地方,那里有很多黑客工具! 你是想查ip指向的实际地址,还是只是想查ip哦。 Ip地址甩出来`` 说吧 128 渗透 652 技术 68 员 68 翱翔在苍...
当自己不具备全局掌控的能力时候,还是找优秀的人来和自己一起做事,这样才能事半功倍,而我所说的,就是在服装的经营方面。 这话怎么讲,就是你是一位技术型人才,而不是销售型的话,最好解决的方法,就是找...
用自己手机查老婆和别人聊天( 怎么知道老婆和谁聊微信) 微信固然只是一个小小的交流对象,但从中能够看到许多器械,由于实际中,朋友们往往都介意本人的言行,幸免获咎他人。但是,在微信身上,许多人却在不经意...
本文导读目录: 1、看门狗解锁ctos塔那关,要怎样才能解开这第一道门? 2、《看门狗》技能解锁的问题,请教大家。 3、看门狗怎么解锁以眼还眼? 4、看门狗秘籍 5、看门狗2黑客入侵怎...
王者荣耀异色公孙离五五限定手办怎么获得?王者荣耀近日上架了一款公孙离的异色手办,这款手办和之前的公孙离手办造型一模一样,二者只有配色不同。和原版温暖的橙色调不同,新手办采用了清冷的紫色调,整体效果更显...
"这件事本身是我们的管理强没做到位,才造成今天的结果。"今天,虎嗅F&M创新节上,盒马生鲜CEO候毅再次就"标签门"事件作出回应。"错了就是错了,盒马诚恳地向消费者道歉,不回避问题,积极承担责任。...