C#中的异常过滤器&try catch语块儿

try catch 语块

使用 try,catch,finally语句捕捉和处理这些异常所代表的错误

tyr{
    int left = int.Parse(lhsOperand.Text);
    int righ = int.Parse(rhsOperand.Text);
    result.Text = answer.ToString();
}catch(FormatException fEx)
{
    // 处理异常
}

代码运行时, 会尝试执行try块内的所有语句 如果没有任何语句产生异常,这些语句将一个接一个运行,直到全部完场 ,但一旦出现异常,就跳出try块,进入一个catch处理程序中执行


使用多个catch

tyr{
    int left = int.Parse(lhsOperand.Text);
    int righ = int.Parse(rhsOperand.Text);
    result.Text = answer.ToString();
}catch(FormatException fEx)
{
    // 处理异常
}catch(FormatException fEx)
{
    // ...
}

异常过滤器

异常过滤器是C#6的新功能,它影响异常和catch处理程序的匹配方式,允许指定catch处理程序的额外使用条件,这些条件采用的型式是when关键字加布尔表达式,

catch(Exception ex)when(ex.GetType()!=typeof(System.OutOfMemoryException)){
// 处理之前未捕捉的除OutOfMemoryException之外的所有异常
}
// GetType方法返回作为实参提供的变量的类型

使用finally块

当catch处理程序运行完毕,会从整个try/catch块之后的语句继续,而不是从抛出异常的语句之后继续,不执行某个语句,

有时没问题,但许多时候都有大问题,解决方案是写一个finally块,放到其中的语句总是运行(无论是否抛出异常),finally块要么紧接在try块之后,要么紧接最后一个catch块之后,

只要程序进入与finally块关联的try块,finally块是种都会运行—即使发生异常,如果抛出异常,而且在本地捕捉阿斗该异常,那么首先运行异常处理程序,然后运行finally块,

如果没有在本地捕捉到异常,那么首先运行finally块,再搜索异常处理程序,无论如何,finally块总是运行.

TextReader reader = ...;
...
try
{
    string line = reader.ReadLine();
    while(line!=null)
    {
        ...
        line = reader.ReadLine();
    }
}
finally
{
    if(reader!=null)
    {
        reader.Dispose();
    }
}

即使读取文件时发生异常,finally块也保证reader.Dispose语句得到执行

你可能感兴趣的:(c#)