您的位置:首页 > 编程语言 > C#

c# try catch finaly用法

2017-03-22 10:28 288 查看
try

catch

finally

1、将预见可能引发异常的代码包含在try语句块中。

2、如果发生了异常,则转入catch的执行。catch有几种写法:

catch

这将捕获任何发生的异常。

catch(Exception e)

这将捕获任何发生的异常。另外,还提供e参数,你可以在处理异常时使用e参数来获得有关异常的信息。

catch(Exception的派生类 e)

这将捕获派生类定义的异常,例如,我想捕获一个无效操作的异常,可以如下写:

catch(InvalidOperationException e)

{

    ....

}

这样,如果try语句块中抛出的异常是InvalidOperationException,将转入该处执行,其他异常不处理。

catch可以有多个,也可以没有,每个catch可以处理一个特定的异常。.net按照你catch的顺序查找异常处理块,如果找到,则进行处理,如果找不到,则向上一层次抛出。如果没有上一层次,则向用户抛出,此时,如果你在调试,程序将中断运行,如果是部署的程序,将会中止。

如果没有catch块,异常总是向上层(如果有)抛出,或者中断程序运行。

3、finally

finally可以没有,也可以只有一个。无论有没有发生异常,它总会在这个异常处理结构的最后运行。即使你在try块内用return返回了,在返回前,finally总是要执行,这以便让你有机会能够在异常处理最后做一些清理工作。如关闭数据库连接等等。

注意:如果没有catch语句块,那么finally块就是必须的。

如果你不希望在这里处理异常,而当异常发生时提交到上层处理,但在这个地方无论发生异常,都要必须要执行一些操作,就可以使用try finally,

很典型的应用就是进行数据库操作:

用下面这个原语来说明:

try

{

    DataConnection.Open();

    DataCommand.ExecuteReader();

    ...

    return;

}

finally

{

    DataConnection.Close();

}

无论是否抛出异常,也无论从什么地方return返回,finally语句块总是会执行,这样你有机会调用Close来关闭数据库连接(即使未打开或打开失败,关闭操作永远是可以执行的),以便于释放已经产生的连接,释放资源。

顺便说明,return是可以放在try语句块中的。但不管在什么时机返回,在返回前,finally将会执行。

小结

try { //执行的代码,其中可能有异常。一旦发现异常,则立即跳到catch执行。否则不会执行catch里面的内容 }

catch { //除非try里面执行代码发生了异常,否则这里的代码不会执行 }

finally { //不管什么情况都会执行,包括try catch 里面用了return ,可以理解为只要执行了try或者catch,就一定会执行 finally }

常见异常和自定义异常

C#异常类一、基类Exception

C#异常类二、常见的异常类

1、SystemException类:该类是System命名空间中所有其他异常类的基类。(建议:公共语言运行时引发的异常通常用此类)

2、ApplicationException类:该类表示应用程序发生非致命错误时所引发的异常(建议:应用程序自身引发的异常通常用此类)

C#异常类三、与参数有关的异常类

此类异常类均派生于SystemException,用于处理给方法成员传递的参数时发生异常

1、ArgumentException类:该类用于处理参数无效的异常,除了继承来的属性名,此类还提供了string类型的属性ParamName表示引发异常的参数名称。

2、FormatException类:该类用于处理参数格式错误的异常。

C#异常类四、与成员访问有关的异常

1、MemberAccessException类:该类用于处理访问类的成员失败时所引发的异常。失败的原因可能的原因是没有足够的访问权限,也可能是要访问的成员根本不存在(类与类之间调用时常用)

2、MemberAccessException类的直接派生类:

i、FileAccessException类:该类用于处理访问字段成员失败所引发的异常

ii、MethodAccessException类:该类用于处理访问方法成员失败所引发的异常

iii、MissingMemberException类:该类用于处理成员不存在时所引发的异常

C#异常类五、与数组有关的异常

以下三个类均继承于SystemException类

1、IndexOutOfException类:该类用于处理下标超出了数组长度所引发的异常

2、ArrayTypeMismatchException类:该类用于处理在数组中存储数据类型不正确的元素所引发的异常

3、RankException类:该类用于处理维数错误所引发的异常

C#异常类六、与IO有关的异常

1、IOException类:该类用于处理进行文件输入输出操作时所引发的异常。

2、IOException类的5个直接派生类:

i、DirectionNotFoundException类:该类用于处理没有找到指定的目录而引发的异常。

ii、FileNotFoundException类:该类用于处理没有找到文件而引发的异常。

iii、EndOfStreamException类:该类用于处理已经到达流的末尾而还要继续读数据而引发的异常。

iv、FileLoadException类:该类用于处理无法加载文件而引发的异常。

v、PathTooLongException类:该类用于处理由于文件名太长而引发的异常。

C#异常类七、与算术有关的异常

1、ArithmeticException类:该类用于处理与算术有关的异常。

2、ArithmeticException类的派生类:

i、DivideByZeroException类:表示整数货十进制运算中试图除以零而引发的异常。

ii、NotFiniteNumberException类:表示浮点数运算中出现无穷打或者非负值时所引发的异常。

在.NET框架中的异常类都派生自SystemException 类。这个类的大部分常用成员如下:

HelpLink是一个链接到帮助文件的链接,该帮助文件提供异常的相关信息。 

Message是指明一个错误细节的文本。 

Source导致异常的对象或应用的名称。 

StackTrace是堆栈中调用的方法列表。 

TargetSite是抛出异常的方法名称。

Try/Catch/Finally 块

C#中使用Try/Catch/Finally块处理一个异常。

Try语句指明在执行过程中需要监视抛出异常的代码块。

Catch语句指明了在执行了Try代码块后应该执行的代码块。这个代码块无论异常是否发生都会执行。实际上,它常用于可能要求的清理代码。

 

 

C#的自定义异常

2009年01月03日 星期六 23:27

对于用户的输入判断是否符合标准,不符合标准的,抛出异常!

1、字符串的长度,在某个区间

2、int,float,double等的大小区间

3、某些字符串里不能包含特殊字符

4、email、datetime等需要有特殊格式限制

其他的再补充…

处理异常的最佳做法
http://msdn.microsoft.com/zh-cn/library/seyhszts.aspx
 

ArgumentException 类:在向方法提供的其中一个参数无效时引发的异常
http://msdn.microsoft.com/zh-cn/library/system.argumentexception.aspx

创建自定义异常主要可以两个类中派生而来:

1.ApplicationException 类

2.System.Exception类

二者的区别是什么?

如何利用C#的自定义异常,这是个要解决的问题!
 

创建自定义异常应该从ApplicationException 类派生而来.应该有一个Exception结尾的类名,应该定义3个构造函数:一个默认构造函数,一个接收字符串(错误消息)构造函数,还有一个接收字符 串参数和异常参数(错误消息和内部异常对象)的构造函数.

例子:

class TestException : ApplicationException

{

public TestException() : base(“exception message”)

{}

public TestException(string message) : base(message)

{

}

public TestException(string message,Exception inner) : base             (message,inner)

{}

}

其他文档资源链接:
http://blog.csdn.net/yubo35033720/archive/2007/05/22/1620146.aspx
http://blog.csdn.net/jbgh608/archive/2007/09/24/1798657.aspx
http://www.tzwhx.com/newOperate/html/1/11/113/6252.html
http://topic.csdn.net/t/20051118/16/4403097.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: