C#异常处理机制及实例展示

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace 异常

{

/*

1.

Exception:所有异常对象的基类。

SystemException:运行时产生的所有错误的基类。

IndexOutOfRangeException:当一个数组的下标超出范围时运行时引发。

NullReferenceException:当一个空对象被引用时运行时引发。

InvalidOperationException:当对方法的调用对对象的当前状态无效时,由某些方法引发。

ArgumentException:所有参数异常的基类。

ArgumentNullException:在参数为空(不允许)的情况下,由方法引发。

ArgumentOutOfRangeException:当参数不在一个给定范围之内时,由方法引发。

InteropException:目标在或发生在CLR外面环境中的异常的基类。

ComException:包含COM类的HRESULT信息的异常。

SEHException:封装Win32结构异常处理信息的异常。

SqlException:封装了SQL操作异常。

2.常见具体的异常对象:

ArgumentNullException 一个空参数传递给方法,该方法不能接受该参数

ArgumentOutOfRangeException 参数值超出范围

ArithmeticException 出现算术上溢或者下溢

ArrayTypeMismatchException 试图在数组中存储错误类型的对象

BadImageFormatException 图形的格式错误

DivideByZeroException 除零异常

DllNotFoundException 找不到引用的DLL

FormatException 参数格式错误

IndexOutOfRangeException 数组索引超出范围

InvalidCastException 使用无效的类

InvalidOperationException 方法的调用时间错误

NotSupportedException 调用的方法在类中没有实现

NullReferenceException 试图使用一个未分配的引用

OutOfMemoryException 内存空间不够

StackOverflowException 堆栈溢出

*/

class Program

{

static void Main(string[] args)

{

Console.WriteLine("除法运算");

计算开始:

var 运算 = new 除法();

运算.运算错误事件 += new Action<double, double>(运算_运算错误事件);

输入Left:

Console.WriteLine("输入左边的数");

var leftStr = Console.ReadLine();

var left = 二元运算.转换(leftStr);

if (!left.HasValue)

{

Console.WriteLine("输入错误");

goto 输入Left;

}

else

{

运算.Left = left.Value;

}

输入Right:

Console.WriteLine("输入右边的数");

var rightStr = Console.ReadLine();

var right = 二元运算.转换(rightStr);

if (!right.HasValue)

{

Console.WriteLine("输入错误");

goto 输入Right;

}

else

{

运算.Right = right.Value;

}

Console.WriteLine("开始计算结果");

var value = 运算.计算结果();

if (value.HasValue)

{

Console.WriteLine("{0}除{1}的结果是:{2}", 运算.Left, 运算.Right, value.Value);

}

else

{

goto 计算开始;

}

Console.ReadLine();

Console.WriteLine("按任意键重新开始");

goto 计算开始;

}

static void 运算_运算错误事件(double arg1, double arg2)

{

Console.WriteLine("{0}和{1}相除出错", arg1, arg2);

}

} public abstract class 二元运算

{

public static double? 转换(string str)

{

try

{

return Double.Parse(str);

}

catch

{

return null;

}

}

double left;

public double Left

{

get { return left; }

set { left = value; }

}

double right;

public double Right

{

get { return right; }

set { right = value; }

}

public 二元运算()

{

}

public 二元运算(double left, double right)

{

this.Left = left;

this.Right = right;

}

public abstract double? 计算结果();

public event Action<double, double> 运算错误事件;

protected virtual void OnError()

{

运算错误事件(Left, Right);

}

}

public class 除法 : 二元运算

{

public override double? 计算结果()

{

double? value = null;

try

{

value = Left / Right;

}

catch

{

OnError();

}

return value;

}

}

}

文章来源:www.900544.com

posted on 2012-09-08 10:22  zieyee  阅读(319)  评论(0)    收藏  举报

导航