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. 保留所有权利。

C#如何使用结构化异常处理的更多相关文章

  1. 第23章 SEH结构化异常处理(2)_编译器对系统SEH机制的封装

    23.2 编译器层面对系统SEH机制的封装 23.2.1 扩展的EXCEPTION_REGISTRATION级相关结构:VC_EXCEPTION_REGISTRATION (1)VC_EXCEPTIO ...

  2. 第23章 SEH结构化异常处理(1)_系统SEH机制

    23.1 基础知识 23.1.1 Windows下的软件异常 (1)中断和异常 ①中断是由外部硬件设备或异步事件产生的 ②异常是由内部事件产生的,可分为故障.陷阱和终止三类. (2)两种异常处理机制: ...

  3. 深入研究 Win32 结构化异常处理(好多相关文章)

    摘要 就像人们常说的那样,Win32 结构化异常处理(SEH)是一个操作系统提供的服务.你能找到的所有关于 SEH 的文档讲的都是针对某个特定编译器的.建立在操作系统层之上的封装库.我将从 SEH 的 ...

  4. 深入研究 Win32 结构化异常处理(作者博客有许多SEH的研究文章)

    摘要 就像人们常说的那样,Win32 结构化异常处理(SEH)是一个操作系统提供的服务.你能找到的所有关于 SEH 的文档讲的都是针对某个特定编译器的.建立在操作系统层之上的封装库.我将从 SEH 的 ...

  5. 异常处理第三讲,SEH(结构化异常处理),异常展开问题

    异常处理第三讲,SEH(结构化异常处理),异常展开问题 作者:IBinary出处:http://www.cnblogs.com/iBinary/版权所有,欢迎保留原文链接进行转载:) 不知道昨天有木有 ...

  6. [C++]深入解析结构化异常处理(SEH)

    http://www.cppblog.com/weiym/archive/2015/02/27/209884.html 尽管以前写过一篇SEH相关的文章<关于SEH的简单总结>, 但那真的 ...

  7. Windows结构化异常处理浅析

    近期一直被一个问题所困扰,就是写出来的程序老是出现无故崩溃,有的地方自己知道可能有问题,但是有的地方又根本没办法知道有什么问题.更苦逼的事情是,我们的程序是需要7x24服务客户,虽然不需要实时精准零差 ...

  8. SEH:结构化异常处理 学习

    SEH:结构化异常处理 结构化异常处理机制提供了一个操作系统,用于优化结构的方案,为客户提供更强大的程序执行环境.试想一下,你写程序不用考虑内存访问错误,那里是空指针错误,一直在按照程序的逻辑结构来写 ...

  9. Windows内存管理(3)--检查内存可用性,结构化异常处理 和 ASSERT

    1.      检查内存可用性 在驱动程序开发中,对内存的操作要格外小心.如果某段内存是只读的,而驱动程序试图去写操作,会导致系统的崩溃. DDK提供了两个函数,帮助程序员在不知道某段内存是否可读写的 ...

随机推荐

  1. html x

    使用 Target 属性,下面的这行会在新窗口打开文档:<a href="http://www.w3school.com.cn/" target="_blank&q ...

  2. 27. Remove Element【easy】

    27. Remove Element[easy] Given an array and a value, remove all instances of that value in place and ...

  3. python自动生成文件头

    "auto add pyhton header --start autocmd BufNewFile *.py 0r ~/.vim/vim_template/vim_python_heade ...

  4. boost中全局命名锁的使用

    使用头文件相对位置为:boost/interprocess/sync/named_mutex.hpp 在程序中使用 boost::interprocess::named_mutex g_namedmu ...

  5. Eclipse开发C/C++之使用技巧小结,写给新手

    我需要在Linux下开发C++项目,没有VS,用Vim开发是不错,但项目大了,效率 就跟不上IDE了,所以选了Eclipse+CDT插件.当然,Vimers觉得我说的不对的请 勿喷哈,我也是水手一个. ...

  6. 解决Eclipse的dropins中svn插件不能加载的问题

    在eclipse的dropins中我们将svn的插件放到里边重启我们的ecplise就能正常加载svn插件了,如下图 但是有时候我们删除了svn的项目之后有可能我们的eclipse就不能正常加载svn ...

  7. 基于AFNetworking的网络判断【原创】

    首先导入AFNetworking第三方框架,然后将下面的.h和.m放在你新建的类中便可 GGNetworkJudge.h   在最后会有Singleton.h头文件代码 #import <Fou ...

  8. Python 爬虫实战3 计算大学本学期绩点

    大家好,本次为大家带来的项目是计算大学本学期绩点.首先说明的是,博主来自山东大学,有属于个人的学生成绩管理系统,需要学号密码才可以登录,不过可能广大读者没有这个学号密码,不能实际进行操作,所以最主要的 ...

  9. PNP与NPN三极管

    主要区别是电流流向和电压不同:PNP管子是发射极流入后从基极和集电极流出,NPN管子是基极和集电极流入从发射极流出.PNP管子工作在放大区时电压是,Ue>Ub>Uc,NPN管子工作在放大区 ...

  10. ini文件

    *.INI内容 [NETWORK] ServerIP=100.100.100.53 程序: main() { char ip[16]; DWORD num=0; num=GetPrivateProfi ...