异常处理基础(C#参考)



throw

  

  throw语句用于发出程序执行期间出现的反常情况(异常)的信号

  引发的异常是一个对象,其类派生自System.Exception

  

try-catch


  一个try块后面接了一个或者多个catch子句,这些子句指定不同异常的处理程序。

  try块中包含可能导致异常的代码。将执行此块,直至引发异常或成功运行。


  例:强制转换null对象会引发NullReferenceException异常

object o2 = null;
try
{
    int i2 = (int)o2;   // Error
}
   尽管可以不带参数使用catch子句,但不推荐这种用法。一般情况下,只应捕获知道如何恢复的异常。

  so,应该始终指定派生自System.Exception的对象参数。如:

catch (InvalidCastException e) 
{
}

  

  try-catch语句中可以有多个特定的catch子句。在这种情况下,catch子句的顺序很重要,因为catch子句是按顺序查找的。使用更笼统的子句之前应该有更针对性的异常。
  筛选想要处理的异常的一种方式是使用catch子句。也可以使用if进一步检查该异常,决定是否要对该异常进行处理,如果返回值为false,则继续查找合适catch子句异常处理程序。

Catch (ArgumentException e) if (e.ParamName == “…”)
{
}
  

  可在catch块中使用throw语句以重新引发已由catch语句捕获的异常。如:从IOException异常提取信息,然后向父方法抛出

catch (FileNotFoundException e)
{
    // 这个方法处理FileNotFoundExceptions异常
}
catch (IOException e)
{
    // 从这个异常中提取部分信息,然后抛给父方法
    if (e.Source != null)
        Console.WriteLine("IOException source: {0}", e.Source);
    throw;
}

  还可以捕获一个异常然后引发一个不同的异常。不过作为捕获的异常最好是内部异常,引发的异常最好是自定义异常

  在try块内,仅初始化在其中声明的变量。否则,在完成执行块之前,可能会出现异常。


  如:变量n在try块内初始化,在try块外使用write方法输出n,将生成编译器错误。

static void Main() 
{
    int n;
    try 
    {
        // 不要在这里初始化这个变量
        n = 123;
    }
    catch
    {
    }
    // 错误:使用了未赋值的局部变量n
    Console.Write(n);
}

try-finally


  使用finally块,可以清理在try中分配的任何资源,而且,即使在try块中发生异常,也可以运行代码。


  已处理的异常中会确保运行关联的finally块。

  如果异常未处理,则finally块的执行取决于如何触发异常展开操作。


try-catch-finally


  catch和finally一起使用的常见方式是:在try块中获取并使用资源,在catch块中处理异常,并在finally块中释放资源

public class EHClass
{
    void ReadFile(int index)
    {
        string path = @"c:\users\public\test.txt";
        System.IO.StreamReader file = new System.IO.StreamReader(path);
        char[] buffer = new char[10];
        try
        {
            file.ReadBlock(buffer, index, buffer.Length);
        }
        catch (System.IO.IOException e)
        {
            Console.WriteLine("Error reading from {0}. Message = {1}", path, e.Message);
        }

        finally
        {
            if (file != null)
            {
                file.Close();
            }
        }
    }

}


  


评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值