本文问答内容:
Q:catch和finally中的代码都在什么时候执行?
A:catch在try中出现异常时对异常进行捕捉;finally中的代码无论try中的代码是否发生异常都会执行,一般进行资源回收等。
1、异常的根类为Exception。异常类一般都继承自Exception
try
{
String s = null;
s.ToString();
}
catch (NullReferenceException ex)
{
Console.WriteLine("为空"+ex.Message);
}
e就是发生异常的异常类对象,变量名只要不冲突就任意。
NullReferenceException都继承自Exception异常类
我们也可以自己创建一个异常类继承自Exception
创建自己的异常类
class ExceptionTest1 : Exception
{
public ExceptionTest1(String msg)
: base(msg)
{
}
}
throw 创建自定义异常类对象
static void SetAge(int nianling)
{
if (nianling < 0)
{
throw new ExceptionTest1("age不能小于0");
}
else
{
Program.age = nianling;//静态方法和静态属性不能用this,无效。使用类名点
}}
2、在异常处理中,一旦try里面有问题了,放弃try代码块异常点之后的代码,直接跳到catch里面执行。如果try代码后还有代码,则处理完catch后还会继续执行。
3、多个异常的处理
try
{
int a = 10;
int b = 0;
Console.WriteLine(a / b);
int[] arr = { 1, 2, 3 };
Console.WriteLine(arr[3]);
}
catch (DivideByZeroException ae)
{
Console.WriteLine("除数不能为0");
}
catch (IndexOutOfRangeException ae)
{
Console.WriteLine("数组越界异常");
}
可以catch住父类异常,这样就可以抓住所有子类异常了,但是强烈不建议大家这样做,特别是不要没理由的catch(Exception ex)
4、好的异常处理习惯:
不要只是把异常catch住什么都不做或者只是打印一下,这不是正常的“异常处理”。
不知道怎么处理就不要catch,出错总比“隐藏报错信息”好。这样以为“不会出错了”,其实是把异常“吃掉了”,会让程序陷入逻辑混乱状态,要科学合理的处理异常。
可以try…catch;可以try…finally;也可以try…catch…finally
下面示例绝不允许!
try
{
string s=null;
s.ToLower();
}
catch(Exception ex)
{
throw ex;//抓住了异常,又再次抛出异常。我师父说教人这样写的这叫狗屎作者
}
finally
{
Console.WriteLine(“finally执行了”);
}