C# 中try块可以捕获测试代码块中的错误。catch块可以处理错误。finally块无论是否try和catch块出现异常都可以执行代码。本文主要介绍C# try catch finally异常处理(Exception)。

1、C# Exceptions

执行C# 代码时,可能会发生不同的错误异常:程序员编写的编码错误,由于输入错误引起的错误或其他不可预见的情况。

发生错误时,C# 通常会停止并生成错误消息。 技术术语是:C# 将引发异常(引发错误)。

2、C# try  catch

try语句允许定义要执行的错误代码块。

如果在try块中发生错误,则catch语句允许定义要执行的代码块。

trycatch关键字成对出现:

语法

try {
  //  要尝试的代码块
}
catch(Exception e) {
  //  处理错误的代码块
}

考虑以下示例:

这将产生一个错误,因为myNumbers[10]不存在。输出将是这样的:

using System;
namespace cjavapy
{
    public class Trycatch
    {
        public static void Main(string[] args)
        {
            int[] myNumbers = { 1, 2, 3 };
            Console.WriteLine(myNumbers[8]); // 不存在会报错!
        }
    }
}

如果发生错误,我们可以使用try catch来捕获错误并执行一些代码来处理该错误:

例如:

using System;
namespace cjavapy
{
    public class Trycatch
    {
        public static void Main(string[] args)
        {
            try
            {
                int[] myNumbers = { 1, 2, 3 };
                Console.WriteLine(myNumbers[8]);
            }
            catch (Exception e)
            {
                Console.WriteLine("输出异常信息等其它操作" + e.Message + e.StackTrace);
            }
        }
    }
}

3、finally

finally语句可以在try catch之后执行代码,而不管是否在try代码中出现异常:

例如:

using System;
namespace cjavapy
{
    public class Trycatch
    {
        public static void Main(string[] args)
        {
            try
            {
                int[] myNumbers = { 1, 2, 3 };
                Console.WriteLine(myNumbers[8]);
            }
            catch (Exception e)
            {
                Console.WriteLine("输出异常信息等其它操作" + e.Message + e.StackTrace);//StackTrace可以查看报错代码行号,排查错误很有用
            }
            finally {
                Console.WriteLine("执行资源释放等相关代码");
            }
        }
    }
}

4、throw关键字

throw语句用于创建抛出自定义错误。

throw语句与异常类型一起使用。 C# 中提供了许多异常类型:

异常类

描述

SystemException

其他用户可处理的异常的基本类

ArgumentException

方法的参数是非法的

ArgumentNullException

一个空参数传递给方法,该方法不能接受该参数

ArgumentOutOfRangeException

参数值超出范围

ArithmeticException

出现算术上溢或者下溢

ArrayTypeMismatchException

试图在数组中存储错误类型的对象

BadImageFormatException

图形的格式错误

DivideByZeroException

除零异常

DllNotFoundException

找不到引用的DLL

FormatException

参数格式错误

IndexOutOfRangeException

数组索引超出范围

InvalidCastException

使用无效的类

InvalidOperationException

方法的调用时间错误

MethodAccessException

试图访问思友或者受保护的方法

MissingMemberException

访问一个无效版本的DLL

NotFiniteNumberException

对象不是一个有效的成员

NotSupportedException

调用的方法在类中没有实现

NullReferenceException

试图使用一个未分配的引用

OutOfMemoryException

内存空间不够

PlatformNotSupportedException

平台不支持某个特定属性时抛出该错误

StackOverflowException

堆栈溢出

SystemException

运行时产生的所有错误的基类。

IndexOutOfRangeException

当一个数组的下标超出范围时运行时引发。

NullReferenceException

当一个空对象被引用时运行时引发。

InvalidOperationException

当对方法的调用对对象的当前状态无效时,由某些方法引发。

ArgumentException

所有参数异常的基类。

ArgumentNullException

在参数为空(不允许)的情况下,由方法引发。

ArgumentOutOfRangeException

当参数不在一个给定范围之内时,由方法引发。

InteropException

目标在或发生在CLR外面环境中的异常的基类。

ComException

包含COM类的HRESULT信息的异常。

SEHException

封装Win32结构异常处理信息的异常。

SqlException

封装了SQL操作异常。

例如:

using System;
namespace cjavapy
{
    public class DemoThrow
    {
        static void CheckValue(int x)
        {
            if (x < 0)
            {
                throw new ArgumentException("error is x < 0");//指定异常信息
            }
            else
            {
                Console.WriteLine("x > 0");
            }
        }
        public static void Main(string[] args)
        {   //CheckValue(11);
            CheckValue(-1);
        }
    }
}

推荐文档