概要
本文介绍如何使用 Microsoft Visual C# .NET 中的结构化异常处理。返回页首
要求
下表概括了推荐使用的硬件、软件、网络架构以及所需的 Service Pack:- Visual C# .NET
本文假定您熟悉下列主题:
- Visual C# .NET
- Microsoft Visual Studio .NET
结构化异常处理
Visual C# .NET 提供了结构化异常处理,此处理机制提供了强大而且更可读的处理错误的方法。结构化异常处理让您能够将错误处理程序嵌套在同一过程中的其他错误处理程序中。结构化异常处理使用了一种类似于 If...Else...End If 语句的模块语法。这使得 Visual C# .NET 代码更为可读和更易于维护。您可以使用异常处理语句的组合来处理 Visual C# .NET 中的异常:- 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 .NET”。
- 在“文件”菜单上,指向“新建”,然后单击“项目”。
- 在“新建项目”对话框中,按照下列步骤操作:
- 在“项目类型”下面,单击“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 模块可以捕捉到此错误,并且“控制台”窗口将显示下面的错误信息:
- 关闭“控制台”窗口。
捕捉多个异常
本部分介绍如何使用多个 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 .NET”。
- 在“文件”菜单上,指向“新建”,然后单击“项目”。
- 在“新建项目”对话框中,按照下列步骤操作:
- 在“项目类型”下面,单击“Visual C# 项目”。
- 在“模板”下,单击“控制台应用程序”。
- 在“名称”框中键入 MyNewConsoleApp。
- 在“位置”框中,键入 C:/,然后单击“确定”。
- 在“项目”菜单上,单击“添加类”。
- 在“添加新项”对话框的“名称”框中,键入 clsPerson.cs,然后单击“打开”。
- 在 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 Web 站点: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
这篇文章中的信息适用于:
- Microsoft Visual C# .NET (2003)
- Microsoft Visual C# .NET (2002)
最近更新: | 2004-1-12 (1.0) |
关键字: | kbProgramming kbExceptHandling kbHOWTOmaster KB816157 kbAudDeveloper |