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. 保留所有权利。
C#如何使用结构化异常处理的更多相关文章
- 第23章 SEH结构化异常处理(2)_编译器对系统SEH机制的封装
23.2 编译器层面对系统SEH机制的封装 23.2.1 扩展的EXCEPTION_REGISTRATION级相关结构:VC_EXCEPTION_REGISTRATION (1)VC_EXCEPTIO ...
- 第23章 SEH结构化异常处理(1)_系统SEH机制
23.1 基础知识 23.1.1 Windows下的软件异常 (1)中断和异常 ①中断是由外部硬件设备或异步事件产生的 ②异常是由内部事件产生的,可分为故障.陷阱和终止三类. (2)两种异常处理机制: ...
- 深入研究 Win32 结构化异常处理(好多相关文章)
摘要 就像人们常说的那样,Win32 结构化异常处理(SEH)是一个操作系统提供的服务.你能找到的所有关于 SEH 的文档讲的都是针对某个特定编译器的.建立在操作系统层之上的封装库.我将从 SEH 的 ...
- 深入研究 Win32 结构化异常处理(作者博客有许多SEH的研究文章)
摘要 就像人们常说的那样,Win32 结构化异常处理(SEH)是一个操作系统提供的服务.你能找到的所有关于 SEH 的文档讲的都是针对某个特定编译器的.建立在操作系统层之上的封装库.我将从 SEH 的 ...
- 异常处理第三讲,SEH(结构化异常处理),异常展开问题
异常处理第三讲,SEH(结构化异常处理),异常展开问题 作者:IBinary出处:http://www.cnblogs.com/iBinary/版权所有,欢迎保留原文链接进行转载:) 不知道昨天有木有 ...
- [C++]深入解析结构化异常处理(SEH)
http://www.cppblog.com/weiym/archive/2015/02/27/209884.html 尽管以前写过一篇SEH相关的文章<关于SEH的简单总结>, 但那真的 ...
- Windows结构化异常处理浅析
近期一直被一个问题所困扰,就是写出来的程序老是出现无故崩溃,有的地方自己知道可能有问题,但是有的地方又根本没办法知道有什么问题.更苦逼的事情是,我们的程序是需要7x24服务客户,虽然不需要实时精准零差 ...
- SEH:结构化异常处理 学习
SEH:结构化异常处理 结构化异常处理机制提供了一个操作系统,用于优化结构的方案,为客户提供更强大的程序执行环境.试想一下,你写程序不用考虑内存访问错误,那里是空指针错误,一直在按照程序的逻辑结构来写 ...
- Windows内存管理(3)--检查内存可用性,结构化异常处理 和 ASSERT
1. 检查内存可用性 在驱动程序开发中,对内存的操作要格外小心.如果某段内存是只读的,而驱动程序试图去写操作,会导致系统的崩溃. DDK提供了两个函数,帮助程序员在不知道某段内存是否可读写的 ...
随机推荐
- zendstdio的智能提示功能
在项目的include的那个地方邮寄,在addsource file 然后指向TP类库的文件夹,刷新项目即可有智能提示
- C/C++ 错误笔记-如果要释放内存,必须拿到内存的首地址进行释放
例:修改字符串的第三个字母为a #include <stdlib.h> #include <string.h> #include <stdio.h> #pragma ...
- Django学习之第三方储存服务器的使用
最近,越来越多的公司采用第三方储存来作为视频,图片的储存工具. 国内的像七牛,阿里云的OSS,国外的像亚马逊的S3,微软的azure都是非常有名的第三方储存. 下面以阿里的OSS为例,来介绍第三储存的 ...
- 没有局域网环境,全是公网IP可以做LVS吗,该如何做了!请大家赐教!
没有局域网环境,全是公网IP可以做LVS吗,该如何做了!请大家赐教! 由 wjjava 在 周四, -- : 提交 LVS集群 现在有3台服务器,各有一个公网IP地址.IP地址形式如下: IP1:12 ...
- python 旧类中使用property特性的方法
在python中,我们可以拦截对象的所有特性访问.通过这种拦截的思路,我们可以在旧式类中实现property方法. __getattribute__(self, name) #当特性name被访问时自 ...
- java内存管理和gc回收机制
Java垃圾回收概况 Java GC(Garbage Collection,垃圾收集,垃圾回收)机制,是Java与C++/C的主要区别之一,作为Java开发者,一般不需要专门编写内存回收和垃圾清理代码 ...
- Tree UVA - 548 已知中序遍历和后序遍历,求这颗二叉树。
You are to determine the value of the leaf node in a given binary tree that is the terminal node of ...
- ZOJ 3963 Heap Partition set维护。给一个序列,将其划分成尽量少的序列,使每一个序列满足按照顺序构造二叉树,父母的值<=孩子的值。
Heap Partition Time Limit: Seconds Memory Limit: KB Special Judge A sequence S = {s1, s2, ..., sn} i ...
- python 开发技巧(1)-- 用PyCharm安装第三方库
在python开发中,我们经常需要安装一些python的第三方类库,包等等,用PyCharm就会安装就会超级方便 1.打开上面的小扳手 2.点击页面左边的Project Interpreter 3.点 ...
- https原理与实践
HTTPS 原理与证书实践 分类: Web应用 1.1 网络安全知识 1.1.1 网结安全出现背景 网络就是实现不同主机之间的通讯,网络出现之初利用TCP/IP协议簇的相关协议概念,已经满足了 ...