try catch的使用源自网络整理

try
        {  //这里是TRY开始,程序开始捕获异常
           //如果有异常  进入 catch {} 然后再进入 finally{}
           //如果没异常 直接进入 finally{}
            conn.Open();
            return (conn.State == ConnectionState.Open);
            //Try结束
        }
        catch (SqlException ex)
        {
            //catch  有异常才会进入我这里
            return false;
        }
        finally
        {
            //无论如何都会进入我这里,这里适合做一些释放资源的事情
            //这里可以舍去不用
            conn.Close();
        }

微软官方参考:http://msdn.microsoft.com/zh-cn/library/zwc8s4fz.aspx

 
 

try-catch 语句由一个 try 块后跟一个或多个 catch 子句构成,这些子句指定不同的异常处理程序。引发异常时,公共语言运行时 (CLR) 会查找处理此异常的 catch 语句。如果当前执行的方法不包含这样的 catch 块,则 CLR 会查看调用当前方法的方法,然后会遍历调用堆栈。如果找不到 catch 块,则 CLR 会向用户显示一条有关未处理异常的消息并停止执行程序。

try 块包含可能导致异常的保护代码。该块一直执行到引发异常或成功完成为止。例如,下列强制转换 null 对象的尝试引发 NullReferenceException 异常:

复制代码
object o2 = null;
try
{
 int i2 = (int)o2; // Error
}

   
   

虽然可以使用不带参数的 catch 子句捕捉任何类型的异常,但不推荐这种用法。通常,您应该只捕捉那些您知道如何从中恢复的异常。因此,应该总是指定一个从 System..::.Exception 派生的对象参数。例如:

复制代码
catch (InvalidCastException e)
{
}

   
   

在同一个 try-catch 语句中可以使用一个以上的特定 catch 子句。这种情况下 catch 子句的顺序很重要,因为会按顺序检查 catch 子句。将先捕获特定程度较高的异常,而不是特定程度较小的异常。如果对 catch 块进行排序以使永远不能达到后面的块,编译器将产生错误。

catch 块中可以使用 throw 语句再次引发已由 catch 语句捕获的异常。例如:

复制代码
catch (InvalidCastException e)
{
 
throw (e); // Rethrowing exception e
}

   
   

您也可以引发新的异常。此时,请将捕捉的异常指定为内部异常:

复制代码
catch (InvalidCastException e)
{
 // Can do cleanup work here.
 throw new CustomException("Error message here.", e);
}

   
   

如果要再次引发当前由无参数的 catch 子句处理的异常,则使用不带参数的 throw 语句。例如:

复制代码
catch
{
 throw;
}

   
   

try 块内部时应该只初始化其中声明的变量;否则,完成该块的执行前可能发生异常。例如,在下面的代码示例中,变量 xtry 块内初始化。试图在 Write(x) 语句中的 try 块外部使用此变量时将产生编译器错误:使用了未赋值的局部变量

复制代码
static void Main()
{
 int x;
 try
 {
 // Don't initialize this variable here.
 x = 123;
 }
 catch
 {
 }
 // Error: Use of unassigned local variable 'x'.
 Console.Write(x);
}

   
   

有关 catch 的更多信息,请参见 try-catch-finally

C#中的try-catch语句使用方法try-catch错误处理表达式允许将任何可能发生异常情形的程序代码放置在try{}程序代码块进行监控,真正处理错误异常的程序代码则被放置在catch{}块内,一个try{}块可对应多个catch{}块。示例try-catch语句写入多个catch的使用通过两个catch语句进行捕获异常,它们分别是ArgumentNullException异常和Exception异常。程序代码如下:using System;class MainClass{static void ProcessString(string str){if (str == null){throw new ArgumentNullException();}}static void Main(){// http://www.isstudy.comConsole.WriteLine("输出结果为:");try{string str = null;ProcessString(str);}catch (ArgumentNullException e){Console.WriteLine("{0} First exception.", e.Message);}catch (Exception e){Console.WriteLine("{0} Second exception.", e.Message);}}}按<Ctrl+F5>键运行程序,运行结果如图1所示。图1 try-catch语句完整程序代码如下:★★★★★主程序文件完整程序代码★★★★★using System;using System.Collections.Generic;using System.Text;namespace _3_16{class Program{static void ProcessString(string str){if (str == null){throw new ArgumentNullException();}}static void Main(){// http://www.isstudy.comConsole.WriteLine("输出结果为:");try{string str = null;ProcessString(str);}catch (ArgumentNullException e){Console.WriteLine("{0} First exception.", e.Message);}catch (Exception e){Console.WriteLine("{0} Second exception.", e.Message);}}}}

throw语句

在学习如何处理异常之前,我们先介绍一下throw语句。

throw语句抛出一个异常:

throw expression

带有表达式的throw语句抛出的异常是在计算这个表达式时产生的。这个表达式必须表示一个System.Exception类型或它的派生类型的值。如果对表达式的计算产生的结果是null,则抛出的将是一个NullReferenceException异常。

不带表达式的throw语句我们稍后再介绍。

异常处理语句

异常是由try语句来处理的。

try语句提供了一种机制来捕捉块执行过程中发生的异常。以下是它的三种可能的形式:

●try-catch(s)●try-finally●try-catch(s)-finally

在介绍try语句之前,我们先介绍一个重要的概念:异常传播。当一个异常被抛出以后,程序将控制权转移给try语句中第一个能够处理该异常的catch子句。这个从异常抛出到控制转移给合适的异常处理语句的过程就叫做异常传播。

异常传播包括重复执行以下步骤,直到找到一个与该异常相匹配的catch子句。

(1).由里层到外层的执行每一个包围抛出点(异常被抛出的最初位置)的try语句。

●如果当前的try块包含一或多条catch子句,那么将按照这些子句的出现顺序对它们逐一检查以定位适合该异常的处理。所谓适合该异常的处理也就是第一个定义了该异常类型或其基类型的catch语句,异常传播也就结束了,程序控制转移到该catch语句执行。

●否则,如果当前的try块含有finally块的话,就执行finally块。如果该块又抛出一个异常,则当前处理的异常被终止。如果没有,则当finally块执行完成以后,再继续异常的处理。

(2).如果当前的成员函数调用中没有定位异常处理,则调用终止。并且在该成员函数调用点将该异常抛给调用者,重复执行上一步。

(3).如果该异常终止了当前线程或进程的所有成员函数调用,则说明该线程或进程中不存在对异常的处理,它将自行终止。

下面让我们回到try语句

如果catch语句中指定了一个类类型,则它必须是System.Exception类型或它的派生类型。如果同时指定了类类型和标识符,就是声明了一个异常变量。异常变量相当于一个作用范围为整个catch块的局部变量。在catch块的执行过程中,异常变量描述了当前正在处理的异常。如果想引用异常对象(其中包括很多重要的错误信息),就必须定义异常变量。

在一个catch块中,可以用不含表达式的throw语句将该catch块捕捉到的异常再次抛出,对于异常变量的分配不会改变两次抛出的异常。

既没有定义异常类型也没有定义异常变量的catch子句称做一般catch子句。该catch子句一般在事先不能确定会发生什么样的异常的情况下使用。一个try语句中只能有一个一般catch子句,而且如果有的话,该catch子句必须排在其它catch子句的后面。

尽管throw语句(含表达式)只能抛出System.Exception类型或它的派生类型的异常,但其它语句并不受该规则限制,因而可以抛出其它类型的异常。比如用一般catch语句就可以捕捉这一类异常,然后利用一个不含表达式的throw语句就可将其再次抛出。

由于寻求异常的处理是通过按照catch子句出现的顺序逐一检查catch子句,因此如果有一个catch子句定义的异常类型与比它先出现的catch子句定义的类型相同或是它的派生类型,就会发生错误。下面的例子中我们演示了try-catch语句的使用以及再次抛出异常。

程序清单8-9:

using System; class Test { static void F(){ try{ G(); } catch(Exception e){ Console.WriteLine("Exception in F:"+e.Message); e=new Exception("F"); throw; } } static void G(){ throw new Exception("G"); } static void Main(){ try{ F(); } catch(Exception){ Console.WriteLine("Exception in Main:"+e.Message); } } }

F方法捕捉到了一个异常,向控制台写了一些诊断信息,改变异常变量的内容,然后将该异常再次抛出。这个被再次抛出的异常与最初捕捉到的异常是同一个。因此程序的输出结果如下:

Exception in F:G

Exception in Main:G

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)
{}
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小白爱吃猪头肉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值