try
catch-当try块里发生错误时,catch块就会被执行
finally-用来执行一些清理代码,无论是否有错误发生
catch块-对错误进行处理/重新抛出异常
finally块总是会被执行
可以有多个catch,每个catch会捕获特定类型的异常
catch子句指定了要捕获的异常的类型-这个异常必须是System.Exception或其子类
先记录log,再将异常重新抛出
可以使用多个catch子句来处理多个异常类型
ex-如果不是这3种异常,程序就会终止运行
将特定类型的异常捕获放在兜底的catch前面
如果不需要访问异常的书写,可以不指定异常变量
把异常类型和变量都去掉-则catch会捕获所有的异常
C#6-在catch子句里添加1个when子句-异常过滤器
finally块永远都会被执行,finally块通常用来写清理代码
唯一可以不让finally块执行的东西就是无线循环,或者程序突然结束
即使try语句块里执行了return,finally块依旧会被执行
IDisposable接口
这个接口定义了1个无参的Dispose方法用来清理这些资源
1的效果=2的效果
因为reader实现了IDisposable接口,所以using语句块执行完时,会自动调用Dispose方法
运行时/用户可以抛出异常
throw用来抛出异常
C#7抛异常
1.expression-bodied
2.三元条件表达式
记录日志后重新抛出异常
throw ex≠throw
throw ex-此时新传递的异常的StackTrace属性就不会反映原始错误了
throw到调用者的地方,让调用者处理
捕获了1个异常,抛出了1个更具体的异常类型,把原异常ex作为第二个参数传进去,有助于调试
捕获1个异常,抛出1个更抽象的异常-防止信息泄漏
System.Exception属性
StackTrace-字符串-展现了从异常发生地到catch块所有的被调用的方法
Message-关于错误的描述信息
InnerException-引起外层异常的内层异常
1.当方法的参数不正确
2.是1异常的1个子类,传入的参数为null,但预期的不应该为null
3.是1异常的1个子类,对于1个数值类型参数太大/太小
4.不合理的操作-对象的状态不适合让方法继续成功的执行-ex想读取1个文件的内容,但是文件还没有被打开
5.特定的功能不支持-ex1个只读的集合,向Add1个元素
6.还没有实现-方法体还没有实现?
7.想调用1个对象上的某个功能,但是对象已经被清理掉了
8.空指针/空引用异常,向调用1个对象,但此时这个对象为null-throw null
Parse/TryParse
如果解析失败
Parse方法会抛出异常
而TryParse方法会返回false
建议使用抛异常而不是错误代码-写1些自定义的异常抛出