C# 中try块可以捕获测试代码块中的错误。catch块可以处理错误。finally块无论是否try和catch块出现异常都可以执行代码。本文主要介绍C# try catch finally异常处理(Exception)。
1、C# Exceptions
执行C# 代码时,可能会发生不同的错误异常:程序员编写的编码错误,由于输入错误引起的错误或其他不可预见的情况。
发生错误时,C# 通常会停止并生成错误消息。技术术语是:C# 将引发异常(引发错误)。
2、C# try catch
try
语句允许定义要执行的错误代码块。
如果在try
块中发生错误,则catch
语句允许定义要执行的代码块。
try
和catch
关键字成对出现:
语法
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);
}
}
}