好的,今天我们来简单介绍一下捕获异常
首先先介绍一下异常:异常是错误,即使你特别的秀,代码也很难不出任何错误。如今的代码很多都会用到第三方源码,各种外部工具等,十分容易出现异常情况。
捕获异常分为3个语句(举个例子):(没用VS体谅体谅)
以下代码均添加了using static System.Console;请自行添加
int b=0;
int a=0;
try
{
a/=b;
}
catch(DivideByZeroException i)
{
WriteLine("Hello World!");
WriteLine(i.Message);
}
finally
{
WriteLine("14");
}
1.try语句用来指明被异常保护的代码块
2catch语句用来处理异常
3finally语句块无论有无异常发生都会执行
2.2一般catch子句能接受任何异常,但不能确定引发异常的类型。这只允许对任何可能发生的异常的普通处理和清理(不建议用一般的catch子句)
catch
{
//do something
}
2.3特定的catch子句形式把一个异常类的名称作为参数,它匹配该指定类或派生自它的异常类的异常(为了保证你们看完,异常类到最后在说)
catch(Exception Type)
{
//do something this
}
2.4带对象的特定的catch子句提供最多的关于异常信息,它匹配该指定类的异常,它还给出一个异常实例,称为异常变量,它是一个对CLR创建的异常对象的引用,可以在catch子句块内部访问一场变量的属性,以获取关于引起的异常的详细信息
catch(Exception Type,instID)
{
}
catch的排列顺序:特定的catch子句必须以最明确的异常类型排第一,直到最普通的类型
3.2在try中如果没有异常,那么将直接跳过catch子句到finally语句
当然,我们也可以用throw来抛出异常
try
{
int b=3;
if(b==3)
{
DivideByZeroException p=new DivideByZeroException();
throw p;
}
}
catch(DivideByZeroException i){
WriteLine("Hello World!");
}
我们也可以不带异常对象但它只能1.重新抛出当前异常,系统继续他的搜索,为该异常搜索另外的处理代码2这种操作只能用在catch子句中
try
{
try
{
int b=3;
if(b==3)
{
DivideByZeroException p=new DivideByZeroException();
throw p;
}
}
catch(DivideByZeroException i)
{
WriteLine("Hello World!");
throw;
}
}
catch{
WriteLine("14");
}
附上Excption对象属性:
1.Date(公共):获取一个提供用户定义的其他异常信息的键/值对的集合
2Helpsult(公共):获取或设置指向此异常的关联帮助文件的连接
3HResult(公共):获取或设置HRESULT(一个分配给特定异常的编码数字值):
4 InnerException:获取导致当前异常的Exception实例
5Message(公共):获取描述当前异常的信息
6Source(公共):获取或设置导致错误的应用程序或对象的名称
7StackTrace(公共):获取调用堆栈上直接帧的字符串表示形式
8TargetSite(公共):获取引发当前异常的方法
Excption类:
1ArgumentException:方法的参数是非法的,除了继承来的属性名,此类还提供了string类型的属性ParamName表示引发异常的参数名称
2ArgumenNullException:一个空参数传递给方法,该方法不能接受该参数
3ArgumenOutOfRangeException:参数值超出范围
4ArithmeticException:出现算数上溢或者下溢
5ArrayTypeMismatchException:试图在数组中存储错误类型的对象
6BadlmageFormatchException:图形的格式错误
7DivideByZeroException:除零异常
8DllNotFindException:找不到引用的DLL
9 IndexoutRangException:数组索引超出范围
10FormatException:参数格式错误
11 InvalidoperationException:方法的调用时间错误
12 InvalidCastException:使用无效的类
13MethodAccessException:试图访问受保护的方法
14MissingMemberException:访问一个无效版本的DLL
15NotFiniteNumberException:使用对象不是一个有效成员
16NotsapportedException:调用的方法在类中并没有被实现
17NullReferenceException:试图使用一个未分配的引用
18OutofMemoryException:内存空间不够
19platformNotsupportedException:平台不支持某个特定属性抛出该错误
20StackOverflowException:堆栈溢出
21SystemException:运行时产生的所有错误的基类
22 NullReferenceException:当一个空对象被引用时运行产生
23 InvalidOperationException:当对方法的调用对对象的当前状态无效时由某些方法引发
24 InteropException:目标或发生在CLR外面环境的异常的基类
25comException:包含com类的HRESULT信息的异常
26SEHException:封装在win32结构异常处理信息的异常
糖果语法 1:
可以把会溢出的代码放在checked块内告诉编译器会发生溢出
checked
{
byte a=254;
a++;
WriteLine($"{a}");
a++;
WriteLine($"{a}");
}
用unchecked告诉编译器你知道这回溢出,让它别报错
unchecked
{
byte a=254;
a++;
WriteLine($"{a}");
a++;
WriteLine($"{a}");
a++;
WriteLine($"{a}");
}
下期再见;