try catch的基本用法就不说了
主要说catch这块,
catch里面填的参数,一般是通用异常
比如 DivideByZeroException ex ,
但正常会帮你写上Exception ex,
Exception 是父类,包含了所有可能的异常,
只要一发生异常,就会执行catch语句。
那肯定有人想问:
像IndexOutOfRangeException、FormatException、OverflowException这些具体的异常,
明明不是可以用if代替吗?
其实当初设立 try catch 语法的主要想解决的就是,
异常处理逻辑和正常的业务逻辑混杂的情况,让异常逻辑从业务逻辑的代码中独立出来。
简而言之,可以让代码更加优雅。(少写if else)
举例:
FileReader fr = new FileReader("path");
if (fr == null) {
System.err.println("Open File Error");
} else {
BufferedReader br = new BufferedReader(fr);
while (br.ready()) {
String line = br.readLine();
if (line == null) {
System.err.println("Read Line Error");
} else {
System.out.println(line);
}
}
}
简写:
try {
FileReader fr = new FileReader("path");
BufferedReader br = new BufferedReader(fr);
while (br.ready()) {
String line = br.readLine();
System.out.println(line);
}
} catch (IOException e) {
e.printStackTrace();
}
是不是“优雅”了许多?
个人认为,
只有错误可预知时才用try,所有不可预知的错误用try都是不负责任的写法。
你把会抛的异常写在自己的函数后面就好了,不需要catch。
关于using
using()
{
}
相当于
try
{}
finally
{}
使用场景是当为了释放某些资源,比如SqlReader。
using其实是实现了IDisposible接口,里面实现了无参的Dispose()方法。
finally是必然执行的代码,及时释放资源是非常重要的。
Tips:
▢ 如果使用throw ex代替throw的话,程序仍可运行,但是新传递的异常的Stacktrace属性就不会反映原始错误了。
▢ yield return语句不可以出现在含有catch子句的try块里面。
▢ yield return也不能出现在catch或finally块里面。