异常就是程序运行中发生的错误,程序如果发生异常,就可以进行异常处理。C#为处理在程序执行期间可能出现的反常情况提供了内置支持。这些异常由正常控制流之外的代码处理。
1 try-catch语句
try-catch语句由一个try块后跟一个或多个catch子句构成,这些子句制定不同的异常处理程序。try块包含可能导致异常的保护代码。该块一只执行到引发异常或成功完成为止。catch子句使用时可以不带任何参数,这种情况下它不惑任何类型的异常,并被称为一般catch子句。它还可以接受从System.Exception派生的对象参数,这种情况下它处理特定的异常。在同一个try-catch语句中使用一个以上的特定catch子句。这种情况下catch子句的顺序很重要,因为会按顺序检查cathc子句,先捕获特定程度较高的异常,而不是特定成都较低的异常
在cathc块中可以使用throw语句再次引发已由catch语句捕获的异常。
class MyClass
{
publci static void Main()
{
MyClass x=new MyClass();
try
{
string s=null;
x.Test(s);
}
catch(Exception e)
{
Console.WriteLine("{0}异常被捕获",e);
}
}
public void Test(string s)
{
if(s==null)
{
throw(new ArgumentNullException());
}
}
}
2 try-finally语句
finally块用于清除try块中分配的任何资源,以及运行任何即使在发生异常时也必须执行的代码。控制总是传递给finally块,与try块的退出方式无关。
catch用于处理语句块中出现的异常,而finally用于保证代码语句块的执行,与前面的try块的退出方式无关
在下面的例子中,由一个导致异常的无效转换语句。当运行语句时,受到一条运行时的错误信息,但finally子句仍继续执行并显示输出
public class MainClass
{
static void Main()
{
int i=123;
string s="Some String";
boject o=s;
try
{
//无效转换
i=(int)o;
}
finally
{
Console.Write("i={0}",i);
}
}
}
上面的示例将导致引发System.InvalidCastException.
尽管捕捉了异常,但仍会执行finally块中包含的输出语句,即:
i=123;
3 try-catch-finally
catch和finally一起使用的常见方式是:在try块中捕获并使用资源,在catch块中处理异常情况,并在finally块中释放资源
static void Main(strnig[]args)
{
try
{
Console.WriteLine("Enter a number");
int i=int.Parse(Console.ReadLine());
}
catch(OverflowException caught)
{
Console.WriteLine(caught);
}
finally
{
Console.WriteLine("Try block final.");
}
}
运行结果如下:
Enter a number
未经处理的异常:System.FormatException:输入字符串的格式不正确。
下面做个小测试,看看最终a 的值是多少
int a=2;
try
{
int i=int32.Parse("s);
}
catch
{
a=1;
return;
}
finally
{
a=3;
}
如果你现在还在思考和计算,说明你对异常的机制还没有太明确。其实只要看finally块里面就能知道,不管前面是什么,最终a的值一定是3