EKsumic's Blog

let today = new Beginning();

Click the left button to use the catalog.

OR

C#try和异常

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块里面。

This article was last edited at 2020-03-19 02:16:30

* *