欢迎来到.net学习网

欢迎联系站长一起更新本网站!QQ:879621940

您当前所在位置:首页 » C#从入门到精通 » 正文

异常处理实例演示

创建时间:2013年10月25日 22:20  阅读次数:(6365)
分享到:
6.2.3使用多个catch处理程序
通过前面的讨论,我们知道不同的错误可能抛出不同类型的异常。为了解决这个问题,可以提供多个catch处理程序。所有catch处理程序应依次列出,就像下面这样:
try
{
int leftHandSide=int.Parse(lhsOperand.Text);
int rightHandSide=int.Parse(rhsOperand.Text);
int answer=doCalculation(leftHandSide,rightHandSide);
result.Text=answer.ToString();
}
catch(FormatException fEx)
{
//...
}
catch(OverflowException oEx)
{
//...
}

6.2.4捕捉多个异常
c#和Microsot.NET Framework的异常捕捉机制是相当完善的。.NET Framework已经定义好了许多不同的异常,几乎包含了程序可能抛出的大多数异常!

通常,并不需要为每个一可能的异常都编写相应的catch处理程序。那么,怎样保证所有可能的异常都被捕捉并处理呢?

为了理解这个问题,关键在于理解各个异常之间的关系。异常采用继承层次结构(inheritance hierarchy)进行组织。这个继承层次结构是由多个“家族”构成的(第12章将详细讨论继承)。FormatException和OverflowException异常都从属于一个名为SystemException(系统异常)的家族。这个家族还包含其他许多异常。在上一节的程序中,实际并不需要单独捕捉每个异常。相反,只需捕捉SystemException就可以了。SystemException本身又是一个名为Exception的家族的成员,而Exception是所有异常的“老祖宗”。捕捉Exception相当于捕捉可能发生的一切异常。

注意:Exception包含众多的异常,其中许多异常是专门供.NET Framework的各种组件使用的。虽然一些异常较难理解,但至少应该知道如何捕捉它们下一个例子展示了如何捕捉所有可能的异常:
try
{
int leftHandSide=int.Parse(lhsOperand.Text);
int rightHandSide=int.Parse(rhsOperand.Text);
int answer=doCalculation(leftHandSide,rightHandSide);
result.Text=answer.ToString();
}
catch(Exception Ex) //这是一个最泛化的catch处理程序,能捕捉一切异常
{
//...
}

提示:如果真的决定捕捉Exception,可以从catch处理程序中省略它的名称,因为默认捕捉的就是Exception:
catch
{
//……
}

但是,并非总是推荐你这样做。在传入catch处理程序的异常对象中,可能包含与异常有关的一些有用的信息。使用这个版本的catch结构来访问,就无法利用这些信息。

最后,还应该想到一个问题:假如一个异常与try块末尾的多个catch处理程序匹配,会发生什么情况?假如一个处理程序捕捉FormatException,另一个捕捉Exception.那么最终会运行哪一个(还是两个都运行)? 

一个异常发生之后,将运行由运行时(runtime)发现的第一个匹配的异常处理程序,其他处理程序会被忽略。假如让一个处理程序捕捉Exception,后面又让一个处理程序捕捉FormatException,后者永远都不会运行。因此,在一个try块之后,应该将较具体的catch处理程序放在泛化的catch处理程序之前。如果没有一个较具体的catch处理程序能够与异常匹配,就执行较泛化的catch处理程序。

在下面的练习中,我们将尝试写一个try块,并捕捉一个异常。
编写try/catch语句
l.如果尚未运行,请启动Visual Studi0 2008。

2.打开MathsOperators解决方案,它位于“文档”文件夹下的\Microsoft Press \Visual CSharp Step By Step\Chapter 6\MathsOperators子文件夹中。这是笫2章的同名程序的一个变体,它当初用于演示不同的算术操作符。

3.在“调试”菜单中选择“开始执行(不调试)”窗体随之出现。我们要在left operand(左操作数)文本框中故意输入一些无效的文本。后面的操作将证明程序的当前版本还欠缺一些可靠性。

4.在left operand文本框中输入John,单击Calculate(计算)按钮。随后会弹出一个对话框(如下图所示),报告应用程序中发生了无法处理的异常:你在left operand文本框中输入的文本造成应用程序出错。


5.如果使用的是Visual Studi0 2008,请单击“调试”按钮。在“Visual Studio实时调试器”对话框的“可能的调试器”列表框中,选择“MathsOperators.Microsoft Visual Studio:Visual Studio 2008”。然后单击“是”按钮。


6.如果使用的是Visual C# 2008速成版,请单击“关闭程序”。然后,在“调试”菜单中选择“开始调试”。在左操作数文本框中输入John,单击Calculate按钮。

7.不管使用的是Visual Stnudi0 2008.还是Visual C# 2008速成版.Visual Studi0 2008调试器都会启动,并突出显示导致异常的那行代码。此外,还显示了有关这个异常的其他些信息。如下图所示。


可以看出,异常是由calculateClick方法内部的int.Parse调用抛出的。问题是这个方法不能把文本”John”解析成一个有效的数字。
注意:除非计算机上有实际的源代码,否则无法看见造成异常的那一行代码。

8.在“调试”菜单中,选掸“停止调试”(或者按快捷键Shifl+F5)。

9.在“代码和文本编辑器”窗口显示Windowl.xaml.cs的代码。找到calculateClick方法。

10.添加一个try块,把该方法内部的4个语句包围起来。下面加粗显示了要新增的代码:
try
{
int leftHandSide=int.Parse(lhsOperand.Text);
int rightHandSide=int.Parse(rhsOperand.Text);
int answer=doCalculation(leftHandSide,rightHandSide);
result.Text=answer.ToString();
}

11.在这个新的try块的}之后,紧接着添加一个catch块,如下所示:
catch(FormatException fEx)
{
result.Text=fEx.Message;
}

这个catch处理程序将捕捉由int.Parse抛出的FormatException.并将它的Message文本写入窗体底部的result文本框的Text属性中。

12.在“调试”菜单中选择“开始执行(不调试)”。

13.在left operand文本框中输入John,单击Calculate按钮。
catch处理程序将成功捕捉FormatException异常.Result文本框将显示消息:“输入字符串的格式不正确”(如下图所示)。现在,应用程序的可靠性稍有增强。


14.用数字10替换John,在right operand文本框内输入Sharp,单击Calculate按钮。
注意,由于try块将对这两个文本框进行解析的语句都包围起来了,所以同一个异常处理程序能处理两个文本框的用户输入错误。

15.单击Quit按钮,返回Visual Studi0 2008编程环境。
来源:.net学习网
说明:所有来源为 .net学习网的文章均为原创,如有转载,请在转载处标注本页地址,谢谢!
【编辑:Wyf】

打赏

取消

感谢您的支持,我会做的更好!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

最新评论

共有评论0条
  • 暂无任何评论,请留下您对本文章的看法,共同参入讨论!
发表评论:
留言人:
内  容:
请输入问题 36+63=? 的结果(结果是:99)
结  果: