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
浙公网安备 33010602011771号