C#如何使用结构化异常处理

Knowledge Base: Chinese (Simplified)  

如何使用 Visual C# .NET 和 Visual C# 2005 中的结构化异常处理文章ID: 816157

最近更新: 2006-10-4

--------------------------------------------------------------------------------
这篇文章中的信息适用于: Microsoft Visual C# .NET 2003 标准版
Microsoft Visual C# .NET 2002 标准版
Microsoft Visual C# 2005 -------------------------------------------------------------------------------- 有关本文的 Microsoft Visual Basic .NET 版本,请参见 315965。
本任务的内容
概要
要求
结构化异常处理
捕捉异常
捕捉多个异常
引发异常
完整代码列表
捕捉异常
捕捉多个异常
引发异常
参考
概要
本文介绍如何使用 Microsoft Visual C# .NET 或 Microsoft Visual C# 2005 中的结构化异常处理。 返回页首
要求
下面列出了推荐使用的硬件、软件、网络基础设施以及所需的 Service Pack:
Visual C# .NET 或 Visual C# 2005 本文假定您熟悉下列主题:
Visual C# .NET 或 Visual C# 2005
Microsoft Visual Studio .NET 或 Microsoft Visual Studio 2005
返回页首
结构化异常处理
Visual C# .NET 提供了结构化异常处理,此处理机制提供了强大而且更容易阅读的处理错误的方法。结构化异常处理让您能够将错误处理程序嵌套在同一过程中的其他错误处理程序中。结构化异常处理使用了一种类似于 If...Else...End If 语句的模块语法。这使得 Visual C# .NET 或 Visual C# 2005 代码更容易阅读和维护。您可以使用异常处理语句的组合来处理 Visual C# .NET 或 Visual C# 2005 中的异常:
try
catch
finally
throw
结构化错误处理的基本语法如下:
try
{
// Code that is expected to raise an exception.
}
catch(Exception e)
{
// Code that can handle an error.
}
finally
{
// Code to do any final cleanup.
} 您可以在 try 模块中包括任何有效的 Visual C# 代码,也可以包括另一个 try 模块或 try 模块层次结构。当任何一点出现异常时,公共语言运行库将找到容纳此代码的最近一层的 try 模块而不用运行任何附加代码行。此控制然后传递到匹配的 catch 模块(如果有),并传递到关联的 finally 模块。您还可以指定多个 catch 语句,以便每个 catch 模块都处理一个特定的错误。 返回页首
捕捉异常
单击“开始”,指向“程序”,指向“Microsoft Visual Studio .NET”或“Microsoft Visual Studio 2005”,然后单击“Microsoft Visual Studio .NET”或 Microsoft Visual Studio 2005。
在“文件”菜单上,指向“新建”,然后单击“项目”。
在“新建项目”对话框中,按照下列步骤操作:
在“项目类型”下面,单击“Visual C# 项目”。 注意:在 Visual Studio 2005 中,单击“项目类型”下的“Visual C#”。
在“模板”下,单击“控制台应用程序”。
在“名称”框中键入 MyConsoleApp。
在“位置”框中,键入 C:\,然后单击“确定”。
将以下代码添加到 Main() 函数中:
int a = 0;
int b = 10;
int c = 0; try
{
a = b / c;
}
catch (Exception e)
{
Console.WriteLine("A run-time error occurred.");
}
finally
{
Console.ReadLine();
}
要运行应用程序,请单击“调试”菜单上的“开始”。此代码将尝试让一个数除以 0。此操作是无效的,并将导致用零作被除数的错误。不过,catch 模块可以捕捉到此错误,并且“控制台”窗口将显示下面的错误消息: A run-time error occurred
关闭“控制台”窗口。
返回页首
捕捉多个异常
本部分介绍如何使用多个 catch 语句处理不同的错误。
打开您在本文“捕捉异常”部分中创建的“控制台应用程序”项目。
将 Main() 函数中现有的代码替换为下面的代码:
int a = 2147483647;
int b = 0;
int c = 0; try
{
a = checked(a + 1);
}
catch (DivideByZeroException e)
{
Console.WriteLine("Error: Divide by Zero", e.Message);
}
catch (OverflowException e)
{
Console.WriteLine("Error: Overflow", e.Message);
}
finally
{
Console.ReadLine();
}
此代码包括两个 catch 模块:
一个 catch 模块捕捉前面的用零作被除数错误。
一个 catch 模块捕捉新的溢出错误。
要运行应用程序,请单击“调试”菜单上的“开始”。“控制台”窗口显示以下错误消息:
Error:Overflow
关闭“控制台”窗口。
因为您不是总能够预料到会出现的每一种错误,所以您可以为无法预料所有异常添加一个 catch 模块。例如,在 finally 语句前添加下面的代码以捕捉任何无法预料的错误,并显示适当的错误消息:
catch (Exception e)
{
Console.WriteLine("Error: ", e.Message);
}
在“文件”菜单上,单击“关闭解决方案”。
返回页首
引发异常
结构化异常处理程序使用 catch 语句来捕捉异常。使用结构化异常处理,还可能会引发一种异常。例如,您可能会发现在 Property Set 过程中执行数据验证时引发一个异常会很有用,因为您可能需要在违反了某一业务规则时引发一条错误消息。
单击“开始”,指向“程序”,指向“Microsoft Visual Studio .NET”或“Microsoft Visual Studio 2005”,然后单击“Microsoft Visual Studio .NET”或“Microsoft Visual Stuio 2005”。
在“文件”菜单上,指向“新建”,然后单击“项目”。
在“新建项目”对话框中,按照下列步骤操作:
在“项目类型”下面,单击“Visual C# 项目”。 注意:在 Visual Studio 2005 中,单击“项目类型”下的“Visual C#”。
在“模板”下,单击“控制台应用程序”。
在“名称”框中键入 MyNewConsoleApp。
在“位置”框中,键入 C:\,然后单击“确定”。
在“项目”菜单上,单击“添加类”。
在“添加新项”对话框的“名称”框中,键入 clsPerson.cs,然后单击“打开”。 注意:在 Visual Studio 2005 中,单击“添加”。
在 clsPerson 类中添加以下代码:
public clsPerson()
{
}
private int mintAge;
public int Value; public int Age
{
get
{
Age = mintAge;
return Age;
} set
{
if(Value > 0)
mintAge = Value;
else
throw new ArgumentException("Age cannot be negative.");
}
}
此代码创建一个 Age 属性。由于一个人的年龄不能为负数,如果类的用户尝试将 Age 属性设置为一个小于 0 的数,将出现一个错误。
在 Class1.cs 的 Main() 函数中,添加下面的代码:
clsPerson p = new clsPerson(); try
{
p.Age = -1;
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
finally
{
Console.ReadLine();
}
要运行应用程序,请单击“调试”菜单上的“开始”。“控制台”窗口显示以下错误消息:
Age cannot be negative
关闭“控制台”窗口。
返回页首
完整代码列表
捕捉异常
using System; namespace MyConsoleApp
{
class Class1
{
[STAThread]
static void Main(string[] args)
{
int a = 0;
int b = 0;
int c = 0; try
{
a = b / c;
}
catch (Exception e)
{
Console.WriteLine("A run-time error occurred.");
}
finally
{
Console.ReadLine();
}
}
}
}
捕捉多个异常
using System; namespace MyConsoleApp
{
class Class1
{
[STAThread]
static void Main(string[] args)
{
int a = 2147483647; try
{
a = checked(a + 1);
}
catch (DivideByZeroException e)
{
Console.WriteLine("Error: Divide by Zero", e.Message);
}
catch (OverflowException e)
{
Console.WriteLine("Error: Overflow", e.Message);
}
catch (Exception e)
{
Console.WriteLine("Error: ", e.Message);
}
finally
{
Console.ReadLine();
}
}
}
} 引发异常
using System; namespace MyNewConsoleApp
{ class Class1
{ [STAThread]
static void Main(string[] args)
{
clsPerson p = new clsPerson(); try
{
p.Age = -1;
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
finally
{
Console.ReadLine();
}
}
}
public class clsPerson
{
public clsPerson()
{
}
private int mintAge;
public int Value; public int Age
{
get
{
Age = mintAge;
return Age;
} set
{
if(Value > 0)
mintAge = Value;
else
throw new ArgumentException("Age cannot be negative.");
}
}
}
}
返回页首
参考
有关更多信息,请访问下面的 Microsoft 网站:
Exception Management Application Block for .NET
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnbda/html/emab-rm.asp How Do I Catch an Exception?
http://samples.gotdotnet.com/quickstart/howto/doc/catch.aspx How Do I Throw an Exception?
http://samples.gotdotnet.com/quickstart/howto/doc/throw.aspx 返回页首
Keywords: kbhowtomaster kbprogramming kbexcepthandling KB816157 -------------------------------------------------------------------------------- Send feedback to Microsoft © Microsoft Corporation. 保留所有权利。
上一篇:Windows内存管理(3)--检查内存可用性,结构化异常处理 和 ASSERT


下一篇:SEH:结构化异常处理 学习