c#异常,只有finally块为什么就不能捕获?

int[] arr = { 1, 2, 3, 4, 5, 6 };

try {
arr[10] = 1;
}
//catch {
// Console.WriteLine("fsdfds");
//}
finally {
Console.WriteLine("error");
}
上面catch块被注释了,导致finally块无法进入
难道捕获异常必须要有catch块么?我在书上看 说只有try和finally也可以的呀

另外还有个问题

图中的 “引发”和“用户未处理的”
选和不选有什么改变 能不能消息说明下
谢谢了
补充:其实主要是对《c#入门经典(第6版)》这本书中如下内容有点看不懂

对于这个,要先理解catch的意义:它是用于捕获try语句块中发生的异常。
而对于try{}finally{}如果执行try语句块中没出现异常,那么代码则能正常执行下去,
但当try中有异常呢,又没有catch,系统该怎么办呢。你不捕获,则系统只能抛出异常,导致程序中止。
因为对于异常,只有两种解决方法,要么抛出,要么捕获,你不捕获,只能抛出。
(这是我的个人理解,如有错误请指出)追问

麻烦解释下补充图片中的内容,谢谢

追答

对于try{} finally{}来说,会先执行try语句块,不管try有没有异常,finally都会执行
但当try语句块有异常时,在执行完finally后,则会抛出异常,如果你没有在其它的地方捕获,则会出错。
所以没有catch是可以的,但是不代表可以不用捕获异常,而是把它抛出,需要在其它地方捕获了。
所以图片中的内容没错。

追问

明白了,非常感谢

温馨提示:内容为网友见解,仅供参考
第1个回答  2014-12-08
finally里面一般放的是不管有没有异常都要执行的步骤,比如关闭数据库连接。
至于没有catch是什么样,我没试过,也不明白你为什么要对这个问题刨根问底。追问

不求甚解不是学习的好习惯

追答

在不该求甚解的地方求甚解更不是好习惯,你要刨根问底应该去看.net的开源代码。
http://referencesource.microsoft.com/

追问

初学者 哪里知道什么改求甚解什么不该求甚解

我只是尽可能的去了解而已,如果东西太深,我自然会放弃,但总要先问一问,看能不能搞懂把
看得懂英文的msdn我还跑这里提问,真是脑子有病
你不知道就不知道,又不丢人

追答

那不是msdn,是源代码,你还分什么类的管理员,你根本不适合。你以前也就多回答点vb而已。

那不是msdn,是源代码,你还分什么类的管理员,你根本不适合。你以前也就多回答点vb而已。

追问

你真扯 我都说了我是初学者 又跟我扯VB 搞笑

追答

那我已经回答你了,不要再在这个地方纠结了好吧。你可以不采纳,我也可以看看后面其他人还有什么高大上的回答。

追问

你不带后面加那句不知所谓的话,我会跟你纠结?
你跑这里发一全英文网页,我会跟你纠结?
不想纠结无视就好了,做人低调点
好好一个提问贴 被你恶心的 我去

追答

搞编程竟然反感英文?国内有易语言。

追问

我不是反感,这里是百度知道
看看这里提问的都是写什么问题
你要在csdn发,没有任何问题
连个IDE都没用清白的人,你要别人去看全英文?
你跑这里发,显得你高大上?

追答

如果说我发英文我是显摆,那你反对英文就是自甘堕落了。我承认我不懂为什么没catch就报错,但我即便不知道,不妨碍我编出优质的软件。你呢,你纠结好了没有。等你研究透了,你是否又可以告诉微软怎么修补C#的漏洞了?

追问

说白了你就是看我说“不求甚解”不爽,发个英文网页堵堵我的嘴
不求甚解 又不是说你 你对号入什么坐

我发个问题,有人回答让我懂了,何乐而不为
你扯微软 有意思么

追答

我要睡觉了,你也洗洗睡吧,过段时间我再来看其他人怎么回答的,OK?如果有更好的以后我学着回答一下。

追问

别走啊 累一天 打打嘴炮也不错啊
也蛮锻炼逻辑思维的呀

追答

我看了你补充的贴图,说两点,

    找入门经典没错,但更好的是直接看msdn的示例和vs安装目录下的samples

    你上面截图的基本是站在编译是否通过的角度来谈是否可以有catch,试问如果你try里面都是正确的代码是否就是和书上不冲突了?建议看书要看经典,这些入门的书有时候反而会误导人,你查一下那作者,看他开发过什么牛逼的软件没有,没准就只是个普通的大学老师。

本回答被提问者采纳
第2个回答  2014-12-09
try
catch
finally 结构是,其中try标识开始异常监控;
catch是捕捉其中的异常
finally是善后工作.
finally无论是否发生异常都会执行.
catch只有出现异常时才会执行追问

麻烦解释下补充图片中的内容,谢谢

追答

try{
}catch{}finally{}是一个结构,是一个语法.和英语的 as....as.. 一样.是个语句块.
他的组成是try开始,后面跟上 catch 或finally.当然,也可以都存在.
如果没有catch,你将无法获知 程序发生异常.catch的作用就是捕捉异常.
finally是善后.如果把try结构的程序比作生活的话,try相当于出生.中间都程序好比是正常的生活,catch就好比发生了意外事故.原本正常的生活结束(try之间的代码).
最后不管你有没有发生意外(catch),都会死亡(finally中的代码).

第3个回答  2014-12-09
建议最外面再套一个try catch,catch里面不做任何处理
这样应该就能看到执行了Console.WriteLine("error");

你的代码由于异常导致程序终止,程序执行太快,你更本看不到它执行了Console.WriteLine("error");追问

麻烦解释下补充图片中的内容,谢谢

追答

    写了try那么就必须写catch或者finally

    如果只写了try和finally,不论是否发生异常,都会执行finally中的代码,然后有异常再抛出异常,没异常就继续程序后面代码

    如果只写了try和catch,若发生异常,异常和catch要捕获的异常种类匹配,匹配成功就执行catch中的代码,异常终止;若匹配失败则抛出异常

    如果只写了try和多个catch,若发生异常,异常从前往后(从上往下)一个一个匹配catch要捕获的异常种类,匹配成功就执行catch中的代码,异常终止;若所有的都匹配失败则抛出异常

    如果写了try,catch,finally,若发生异常,匹配catch成功,则执行catch再执行finally,程序继续后面代码;匹配失败,则执行finally然后抛出异常;若没有异常,则执行finally,程序继续后面代码

    如果写了try,多个catch,finally参考前面应该能知道了

追问

清楚了,感谢

第4个回答  2014-12-09
因为异常没处理 所以继续向上抛出
比如你写了catch快扑捉空指针异常 不捕获其他异常 如果遇到非空指针异常也会向上抛出
相似回答