概述
首先参考MSDN:try-catch(C# 参考)http://msdn.microsoft.com/zh-cn/library/0yd65esw(VS.80).aspx
一个性能良好且稳健的程序应该允许异常情况发生、避免终止运行,这就要求编程人员能够预知可能发生的特情况,并且在程序编码处理这些特殊情况,我们称这个过程叫“异常处理”或“错误处理”。
如下列代码在执行过程会出现“算术除0”这样的异常:
INPUT Divisor
IF Divisor = 0 THEN
Result = Divident/Divisor
....
System.Exception
.NET Framework提供了很多处理异常的类,如图5所示:
图5 Exception类的层次结构
SystemException 其他用户可处理的异常的基本类
ArgumentException 方法的参数是非法的
ArgumentNullException 一个空参数传递给方法,该方法不能接受该参数
ArgumentOutOfRangeException 参数值超出范围
ArithmeticException 出现算术上溢或者下溢
ArrayTypeMismatchException 试图在数组中存储错误类型的对象
BadImageFormatException 图形的格式错误
DivideByZeroException 除零异常
DllNotFoundException 找不到引用的DLL
FormatException 参数格式错误
IndexOutOfRangeException 数组索引超出范围
InvalidCastException 使用无效的类
InvalidOperationException 方法的调用时间错误
MethodAccessException 试图访问思友或者受保护的方法
MissingMemberException 访问一个无效版本的DLL
NotFiniteNumberException 对象不是一个有效的成员
NotSupportedException 调用的方法在类中没有实现
NullReferenceException 试图使用一个未分配的引用
OutOfMemoryException 内存空间不够
PlatformNotSupportedException 平台不支持某个特定属性时抛出该错误
StackOverflowException 堆栈溢出
Exception:所有异常对象的基类。
SystemException:运行时产生的所有错误的基类。
IndexOutOfRangeException:当一个数组的下标超出范围时运行时引发。
NullReferenceException:当一个空对象被引用时运行时引发。
InvalidOperationException:当对方法的调用对对象的当前状态无效时,由某些方法引发。
ArgumentException:所有参数异常的基类。
ArgumentNullException:在参数为空(不允许)的情况下,由方法引发。
ArgumentOutOfRangeException:当参数不在一个给定范围之内时,由方法引发。
InteropException:目标在或发生在CLR外面环境中的异常的基类。
ComException:包含COM类的HRESULT信息的异常。
SEHException:封装Win32结构异常处理信息的异常。
SqlException:封装了SQL操作异常
l Exception类的属性
n Message:描述错误信息
n Source:显示异常发生时的应用程序或对象名
n StackTrace:显示异常发生时的堆栈信息
n InnerException:对内部异常的引用
l 引发异常的方式
n 使用显式 throw 语句来引发异常。在此情况下,控制权将无条件转到处理异常的部分代码
n 使用语句或表达式在执行过程中激发了某个异常的条件,使得操作无法正常结束,从而引发异常
l try和catch块
n 格式:
try
{
//可能发生异常的程序代码
}
catch (异常对象1)
{
//错误处理程序
}
catch(异常对象2)
{
//错误处理程序
}
finally
{
//不管异常有无发生都要执行的代码
}
n 执行流程如图6所示
图6 执行流程
n 示例1:
try
{
//程序代码
}
catch(System.Exception E)//可以处理各种异常
{
//错误处理代码
}
n 示例2:
try
{
//程序代码
}
catch (IOException E) //捕捉IO异常
{
//错误处理代码
}
l 使用throw引发异常
使用throw可以引发系统异常,也可以引发自定义异常,格式如下列代码所示:
if (UserInput < 1 && UserInput > 100)
{
throw new InvalidNumberInput(UserInput + “不是有效输入(请输入 1 和 100 之间的数字)”);
}
l 自定义异常
写一个类,这个类必须直接或间接继承System.ApplicationException类。
n 示例
Ø 定义一个异常类:
using System;
public class EmailErrorException:ApplicationException
{
public string _message;
//重写构造函数
public EmailErrorException():base()
{
_message = null;
}
public EmailErrorException(string message):base()
{
_message = message.ToString();
}
public EmailErrorException(string message,
Exception myNew):base(message,myNew)
{
_message = message.ToString();
}
//Message属性的重载
public override string Message
{
get
{
return "Email格式错误。";
}
}
}
Ø 用throw引发自定义异常
private bool SaveInfo(string name, string email)
{
string[] subStrings = email.Split('@');
//如果输入的Email不是被“@”字符分割成两段,则抛出Email错误异常
if(subStrings.Length != 2)
{
throw new EmailErrorException();
}
else
{
int index = subStrings[1].IndexOf(".");
//查找被“@”字符分成的两段的后一段中“.”字符的位置,没有“.”
//或者“.”字符是第一个字符,则抛出EmailErrorException异常
if(index <= 0)
{
throw new EmailErrorException();
}
//如果“.”字符是最后一个字符,抛出EmailErrorException异常
if(subStrings[1][subStrings[1].Length -1] == '.')
{
throw new EmailErrorException();
}
}
return true;
}
Ø Catch自定义异常
private void btnSubmit_Click(object sender, System.EventArgs e)
{
if(txtName.Text.Length == 0 && txtEmail.Text.Length == 0)
{
MessageBox.Show("请填写姓名和Email。", "填写不完整"
, MessageBoxButtons.OK
, MessageBoxIcon.Information);
return;
}
try
{
SaveInfo(txtName.Text, txtEmail.Text);
}
catch(EmailErrorException ex)
{
MessageBox.Show(ex.Message, "Email 格式错误"
, System.Windows.Forms.MessageBoxButtons.OK
, MessageBoxIcon.Information);
return;
}
MessageBox.Show("保存成功。", "成功"
, MessageBoxButtons.OK
, MessageBoxIcon.Information);
}
小结
u 调试是搜寻和消除应用程序中的错误的过程
u 语法错误表示编译器无法理解代码
u 调试模式可用来重复编译和排除应用程序中的错误,直至能够成功运行
u“局部变量”窗口允许用户监控当前程序中所有变量的值
u 单元测试和集成测试是测试大型应用程序的常用技术
u 当应用程序遇到运行时错误时,就会引发异常
u C# 中的所有异常都派生自 Exception 类
最后
以上就是稳重身影为你收集整理的C# 异常处理的全部内容,希望文章能够帮你解决C# 异常处理所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复