HOW TO:使用 Visual C# .NET 中的结构化异常处理 (From MSDN)

有关本文的 Microsoft Visual Basic .NET 版本,请参阅 315965

本任务的内容

概要

本文介绍如何使用 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 模块都处理一个特定的错误。

返回页首

捕捉异常

  1. 单击“开始”,指向“程序”,指向“Microsoft Visual Studio .NET”,然后单击“Microsoft Visual Studio .NET”。
  2. 在“文件”菜单上,指向“新建”,然后单击“项目”。
  3. 在“新建项目”对话框中,按照下列步骤操作:
    1. 在“项目类型”下面,单击“Visual C# 项目”。
    2. 在“模板”下,单击“控制台应用程序”。
    3. 在“名称”框中键入 MyConsoleApp
    4. 在“位置”框中,键入 C:/,然后单击“确定”。
  4. 将以下代码添加到 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();
    			}
  5. 若要运行应用程序,请单击“调试”菜单上的“开始”。此代码将尝试让一个数除以 0。此操作是无效的,并将导致用零作被除数的错误。不过,catch 模块可以捕捉到此错误,并且“控制台”窗口将显示下面的错误信息:


    A run-time error occurred
  6. 关闭“控制台”窗口。
返回页首

捕捉多个异常

本部分介绍如何使用多个 catch 语句处理不同的错误。
  1. 打开您在本文“捕捉异常”部分中创建的“控制台应用程序”项目。
  2. 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 模块捕捉新的溢出错误。
  3. 要运行此应用程序,请单击“调试”菜单上的“开始”。“控制台”窗口显示以下错误信息:
    Error:Overflow
  4. 关闭“控制台”窗口。
  5. 因为您不是总能够预料到会出现的每一种错误,所以您可以为无法预料所有异常添加一个 catch 模块。例如,在 finally 语句前添加下面的代码以捕捉任何无法预料的错误,并显示适当的错误信息:
    catch (Exception e)
    			{
    				Console.WriteLine("Error: ", e.Message);
    			}
  6. 在“文件”菜单上,单击“关闭解决方案”。
返回页首

引发异常

结构化异常处理程序使用 catch 语句来捕捉异常。使用结构化异常处理,还可能会引发一种异常。例如,您可能会发现在 Property Set 过程中执行数据验证时引发一个异常会很有用,因为您可能需要在违反了某一业务规则时引发一条错误信息。
  1. 单击“开始”,指向“程序”,指向“Microsoft Visual Studio .NET”,然后单击“Microsoft Visual Studio .NET”。
  2. 在“文件”菜单上,指向“新建”,然后单击“项目”。
  3. 在“新建项目”对话框中,按照下列步骤操作:
    1. 在“项目类型”下面,单击“Visual C# 项目”。
    2. 在“模板”下,单击“控制台应用程序”。
    3. 在“名称”框中键入 MyNewConsoleApp
    4. 在“位置”框中,键入 C:/,然后单击“确定”。
  4. 在“项目”菜单上,单击“添加类”。
  5. 在“添加新项”对话框的“名称”框中,键入 clsPerson.cs,然后单击“打开”。
  6. 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 的数,将出现一个错误。
  7. Class1.csMain() 函数中,添加下面的代码:
    clsPerson p = new clsPerson();
    
    			try 
    			{
    				p.Age = -1;
    			}
    			catch (Exception e)
    			{
    				Console.WriteLine(e.Message);
    			}
    			finally
    			{
    				Console.ReadLine();
    			}
  8. 要运行此应用程序,请单击“调试”菜单上的“开始”。“控制台”窗口显示以下错误信息:
    Age cannot be negative
  9. 关闭“控制台”窗口。
返回页首

完整代码列表

捕捉异常
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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值