第三章 异常处理和类
一、异常处理语句
1.什么是异常:在程序运行期间发生的错误或意外(异常是一种错误条件,当代码路径的正常控制流程不符合实际或是不正确时,异常就会发生)。
2.Visual C#语言的异常处理方法:在程序中加入异常控制代码,提供更为明确的处理结果
3.异常处理语句的使用
(1)格式1:try-catch语句
try语句块中包含可能产生异常的代码,catch中指定对异常的处理
class trycatchstatement
{
public void test()
{
try
{
int b = int.Parse("abc");
}
catch (FormatException ex)
{
Console.WriteLine(ex.Message);
}
}
}
、
(2)格式2:try-finally语句
try语句块包含可能产生异常的代码 finally中指定最终都要执行的子语句
class trycatchstatement
{
public void test()
{
try
{
int b = int.Parse("abc");
}
finally
{
Console.WriteLine("执行结束");
}
}
}
与格式1比较,程序不提供对异常的处理,只保证finally语句块中的代码一定被执行
(3)格式3:try-catch-finally(常用格式)
try语句块中包含可能产生异常的代码,catch中指定对异常的处理,finally中指定最终都要执行的子语句,放在所有catch后,只能出现一次
class trycatchstatement
{
public void test()
{
try
{
int b = int.Parse("abc");
}
catch (FormatException ex)
{
Console.WriteLine(ex.Message);
}
finally
{
Console.WriteLine("执行结束");
}
}
}
(4)throw语句
throw语句可以重新引发一个已捕获的异常,还可以引发一个预定义的或自定义的异常,可被外围的try语句接收,throw引发的异常称为显示引发异常
class trycatchstatement
{
public void test()
{
try
{
int b = int.Parse("abc");
string str = null;
if (str = null)
{
ArgumentException ex = new ArgumentNullException();
throw ex;
}
}
catch (ArgumentException ex)
{
Console.WriteLine(ex.Message);
}
finally
{
Console.WriteLine("执行结束");
}
}
}
(5)关于异常的特定程度高低
当try语句中有多个异常抛出时,catch语句也必须有多个,与异常相对应。则多个catch语句的顺序对异常的处理有影响。因为程序是按照顺序检查catch语句,将先捕获特定程度较高的异常。所谓异常的特定程度,与C#中异常类的层次结构(继承关系)有关。
同时使用多个catch语句时,如果其中有两个catch语句所捕获的异常类存在继承关系,那么要保证捕获派生类的catch语句在前,而捕获基类的catch语句在后。否则,捕获派生异常类的catch语句不会起任何作用或者系统报错。
.NET中异常类直接的派生关系如下图所示
Exception是所有异常类的父类
SystemException:是System命名空间中所有其他异常类的基类
IOException:该类用于处理进行文件输入输出操作时所引发的异常
ApplicationException:该类表示应用程序发生非致命错误时所引发的异常,自定义异常派生自该类
Exception特定程度高低代码范例
public void test()
{
try
{
int b = int.Parse("abc");
string str = null;
if (str == null)
{
ArgumentException ex = new ArgumentNullException();
throw ex;
}
}
//如果把第三个catch移置第一,观察结果有何变化
catch (ArgumentException ex)
{
Console.WriteLine("ArgumentException " + ex.Message);
}
catch (FormatException ex)
{
Console.WriteLine("FormatException " + ex.Message);
}
catch (Exception ex)
{
Console.WriteLine("Exception " + ex.Message);
}
finally
{
Console.WriteLine("执行结束");
}
}
(6)Exception常见属性与方法
属性名 | 功能 |
Data | 这个属性可以给异常添加键/值语句,以提供异常的额外信息。 |
HelpLink | 链接到一个帮助文件上,以提供该异常的更多信息 |
InnerException | 如果此异常是在catch块中抛出的,它就会包含把代码发送到catch块中的异常对象 |
Source | 导致异常的应用程序或对象名 |
StackTrace | 堆栈上方法调用的信息,它有助于跟踪抛出异常的方法 |
TargetSite | 描述抛出异常的方法的.NET反射对象 |
Message | 描述错误情况的文本 |
二、预定义异常处理
C#已经预定义了一些异常,使用时只需要定义该中异常类型即可,以常见的除法运算,除数不为零为例。
public void run()
{
//goon:
try
{
Console.WriteLine("请输入被除数!");
int num1 = int.Parse(Console.ReadLine());
writeline方法属于类Console.WriteLine("请输入除数!");
int num2 = int.Parse(Console.ReadLine());
int resutl = num1 / num2;
Console.WriteLine("运算结果是{0}", resutl);
}
catch (DivideByZeroException ex)
{
Console.WriteLine(ex.Message);
//goto goon;
}
finally
{
Console.WriteLine("运行结束了!");
}
}
三、自定义异常
除了可以使用系统预定义的异常以为,还可以根据需要自己定义异常。由Exception或者Exception类的子类派生。
步骤:
1.自定义异常类,继承自某个异常
2.重写构造函数和属性(Message属性),或者声明方法
3.在可能出现问题的地方调用
class ageexception : Exception
{
string _message;
//获得父类的错误信息内容
public ageexception()
{
_message = base.Message;
}
public ageexception(string strmessage)
{
_message = strmessage;
}
//重写message属性
public override string Message
{
get
{
return _message ;
}
}
//或者定义方法输出异常信息
public void pm()
{
Console.WriteLine(_message);
}
}
try
{
Console .WriteLine ("请输入年龄");
int age=int.Parse(Console .ReadLine());
if (age>20 || age< 10)
{
string message = "你输入的年纪不符合要求!";
ageexception a=new ageexception (message );
throw a;
}
}
catch (ageexception a)
{
Console.WriteLine(a.Message);
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论