try..catch 为什么不执行finally

问题描述

请大神帮我看看,这一段代码抛出异常之后,为什么finally里的代码不执行。publicvoidGet_Image(stringygname,PictureBoxpb){byte[]imagebytes=null;//声明字节数组变量conn.Open();//打开数据库连接SqlCommandcom=newSqlCommand(//创建命令对象"select*fromtb_employeewhereemployeeID="+ygname+"",conn);SqlDataReaderdr=com.ExecuteReader();//执行sql命令,并创建sqldatareader接收try{while(dr.Read())//读取数据库中的数据{imagebytes=(byte[])dr.GetValue(11);//得到图像的字节数据}}catch(Exceptionex){MessageBox.Show(ex.Message);return;}finally{dr.Close();//关闭数据读取器conn.Close();}MemoryStreamms=newMemoryStream(imagebytes);//创建内存流对象Bitmapbmpt=newBitmap(ms);//创建bmp对象pb.Image=bmpt;//显示图像信息}

解决方案

解决方案二:
断点设到finally里面finally{dr.Close();//关闭数据读取器conn.Close();}dr.Close();是不是这句又引发了exceptionconn.Close();是不是这句又引发了exception
解决方案三:
代码抛出异常之后,就执行了catch(Exceptionex),代码正常才会执行finally你看一下为何抛出异常,
解决方案四:
引用2楼wind_cloud2011的回复:

代码抛出异常之后,就执行了catch(Exceptionex),代码正常才会执行finally你看一下为何抛出异常,

我记得不论是否异常都会执行finally的啊
解决方案五:
MessageBox.Show(ex.Message);return;
解决方案六:
我感觉异常不是出在try板块里面。。这样就不会执行finally了
解决方案七:
应该在try前就不对了,sql语句有问题了SqlCommandcom=newSqlCommand(//创建命令对象"select*fromtb_employeewhereemployeeID="+ygname+"",conn);SqlDataReaderdr=com.ExecuteReader();加上单引号:SqlCommandcom=newSqlCommand(//创建命令对象"select*fromtb_employeewhereemployeeID='"+ygname+"'",conn);
解决方案八:
既然你写成try{}catch{}finally{}形式,在finally前,就不要用return额,不然程序执行到return后,就会跳出过程的。
解决方案九:
引用5楼u012948520的回复:

我感觉异常不是出在try板块里面。。这样就不会执行finally了

应该是。楼主检查一下sql,连接字符串,一般的写法是要把操作db的语句都放到try中
解决方案十:
引用7楼yangb0803的回复:

既然你写成try{}catch{}finally{}形式,在finally前,就不要用return额,不然程序执行到return后,就会跳出过程的。

return是为了阻止finally后面的语句执行,不影响finally本身
解决方案十一:
如果想写得规范点,应该这样写byte[]imagebytes=null;//声明字节数组变量try{using(varconn=CreateNewConnection(connString)){conn.Open();//打开数据库连接SqlCommandcom=newSqlCommand(//创建命令对象"selectimage_fieldfromtb_employeewhereemployeeID="+ygname+"",conn);SqlDataReaderdr=com.ExecuteReader();//执行sql命令,并创建sqldatareader接收dr.Read())imagebytes=(byte[])dr.GetValue(0);//得到图像的字节数据}}catch(Exceptionex){MessageBox.Show(ex.Message);return;}MemoryStreamms=newMemoryStream(imagebytes);//创建内存流对象Bitmapbmpt=newBitmap(ms);//创建bmp对象pb.Image=bmpt;//显示图像信息

你根本用不着纠结什么conn.Close语句,这样写出来的代码就容易靠谱地维护。
解决方案十二:
csdn的编辑比较烂,我试着重新排一下缩进byte[]imagebytes=null;//声明字节数组变量try{using(varconn=CreateNewConnection(connString)){conn.Open();//打开数据库连接SqlCommandcom=newSqlCommand(//创建命令对象"selectimage_fieldfromtb_employeewhereemployeeID="+ygname+"",conn);SqlDataReaderdr=com.ExecuteReader();//执行sql命令,并创建sqldatareader接收dr.Read())imagebytes=(byte[])dr.GetValue(0);//得到图像的字节数据}}catch(Exceptionex){MessageBox.Show(ex.Message);return;}MemoryStreamms=newMemoryStream(imagebytes);//创建内存流对象Bitmapbmpt=newBitmap(ms);//创建bmp对象pb.Image=bmpt;

记住要使用using{}结构化语句,不要写多余的什么close、finally代码。
解决方案十三:
不管是否有异常,是否retuen,finally都是会执行的的。不执行finally那就是在trycatchfinally外面有一场了。比如://vardd=newException("Test2");//throwdd;try{varaa=newException("Test");throwaa;}catch(Exceptionex){varbb=ex.Message;return;}finally{varcc=string.Empty;}
解决方案十四:
try之前就出错了,当然不会执行finally了
解决方案十五:
断点sql语句之前,看try之前是不是错了。。
解决方案:
单步调试下就一目了然了
解决方案:
引用2楼wind_cloud2011的回复:

代码抛出异常之后,就执行了catch(Exceptionex),代码正常才会执行finally你看一下为何抛出异常,

我网上查找的都是finally无论如何都会执行的啊,不是这样吗?
解决方案:
引用10楼sp1234的回复:

如果想写得规范点,应该这样写byte[]imagebytes=null;//声明字节数组变量try{using(varconn=CreateNewConnection(connString)){conn.Open();//打开数据库连接SqlCommandcom=newSqlCommand(//创建命令对象"selectimage_fieldfromtb_employeewhereemployeeID="+ygname+"",conn);SqlDataReaderdr=com.ExecuteReader();//执行sql命令,并创建sqldatareader接收dr.Read())imagebytes=(byte[])dr.GetValue(0);//得到图像的字节数据}}catch(Exceptionex){MessageBox.Show(ex.Message);return;}MemoryStreamms=newMemoryStream(imagebytes);//创建内存流对象Bitmapbmpt=newBitmap(ms);//创建bmp对象pb.Image=bmpt;//显示图像信息

你根本用不着纠结什么conn.Close语句,这样写出来的代码就容易靠谱地维护。

非常感谢。
解决方案:
引用16楼oZHOUDJ的回复:

Quote: 引用2楼wind_cloud2011的回复:
代码抛出异常之后,就执行了catch(Exceptionex),代码正常才会执行finally你看一下为何抛出异常,

我网上查找的都是finally无论如何都会执行的啊,不是这样吗?

我写错了,是因为你SQL语句有问题,是在try外,所以到不了finally,SqlCommandcom=newSqlCommand(//创建命令对象"select*fromtb_employeewhereemployeeID='"+ygname+"'",conn);ygname是字符串,应该加上单引号,你再如楼上的高手写的放在try里,就OK了
解决方案:

解决方案:
引用9楼ljc82的回复:

Quote: 引用7楼yangb0803的回复:
既然你写成try{}catch{}finally{}形式,在finally前,就不要用return额,不然程序执行到return后,就会跳出过程的。

return是为了阻止finally后面的语句执行,不影响finally本身

同意,finally中的代码在返回任何类型(即方法的返回类型,也叫函数的返回类型)的值之前都会执行的。
解决方案:
路过,来学习一下了。
解决方案:
难道真的不是return?
解决方案:
你要把conn.Open();//打开数据库连接SqlCommandcom=newSqlCommand(//创建命令对象"select*fromtb_employeewhereemployeeID="+ygname+"",conn);SqlDataReaderdr=com.ExecuteReader();这些都放到try里面去否则根本没有执行try,执行什么finally啊
解决方案:
finally跟try是在同一个结构里不管try是否抛异常,是否return,都会执行但是前提是必须先执行try如果try本身都没有执行,finally当然也不执行
解决方案:
catch里有return
解决方案:
看来很多人对finally和return搞不清楚。即便在代码中return了,finally也会被执行。
解决方案:
conn.Open();以及执行查询都是有可能抛出异常的,应该包在try内。
解决方案:
引用26楼davinciyxw的回复:

看来很多人对finally和return搞不清楚。即便在代码中return了,finally也会被执行。


解决方案:

解决方案:
byte[]imagebytes=null;//声明字节数组变量conn.Open();//打开数据库连接SqlCommandcom=newSqlCommand(//创建命令对象"select*fromtb_employeewhereemployeeID="+ygname+"",conn);SqlDataReaderdr=com.ExecuteReader();//执行sql命令,并创建sqldatareader接收

这几句放到try里面去····
解决方案:
引用7楼yangb0803的回复:

既然你写成try{}catch{}finally{}形式,在finally前,就不要用return额,不然程序执行到return后,就会跳出过程的。

谁和你说的?执行到return不会立马return而是跳过去执行finallyfinally执行完毕才回到catch里return
解决方案:
return掉了,自然不执行finally了。
解决方案:
引用31楼kxm_2012的回复:

Quote: 引用7楼yangb0803的回复:
既然你写成try{}catch{}finally{}形式,在finally前,就不要用return额,不然程序执行到return后,就会跳出过程的。

谁和你说的?执行到return不会立马return而是跳过去执行finallyfinally执行完毕才回到catch里return

错误,跟一下代码就会发现,代码根本不会逆向执行回去正常return会goto到}函数结尾而在try或catch里执行了return,相当于gotofinally,执行完finally之后才goto到结尾
解决方案:
很明显的return;
解决方案:
发现好多人认为是'return'的问题,刚开始我也是这么认为的....学习了!
解决方案:
F10F11看看吧,谁知道是怎么回事
解决方案:
SqlDataReaderdr=com.ExecuteReader();放在try外面,这样还有意义吗?出错大多是open和执行
解决方案:
如果执行到return是不会再执行当前函数的,确实,无论是否有catch到错误,最终都会执行finally,除非在try之前就已经出错
解决方案:
你return了还可以执行?
解决方案:
return在catch里,写法不太规范。。
解决方案:
try{}catch()finally{}机制你没弄明白,不要再catch里面写return那样是没有意义的不关前面是不是抛出异常finally一定会执行下去关于数据流的操作必须放在异常处理里面,数据流很容易发生数据丢失对象缺失等异常问题
解决方案:
是不是应该把数据库的操作都放到try里,然后貌似return那不会执行到finally吧,个人意见
解决方案:
try之前是不是已经异常了?
解决方案:
总结一下:进入try之后,即使return了,finally也是会执行的!以前有个题目,考在catch中return一个值,finally也return一个值,最后return的结果是什么!
解决方案:
把从“conn.Open();”开始的代码也放到try内部,就知道是不是之前try外部就发生了异常了
解决方案:
return了都跳出方法了还执行个鬼。
解决方案:
因为你在catch里面return了,所以程序抛出异常finally就不会执行
解决方案:
return;这里返回了删除
解决方案:
楼上很多人都错了,finally没执行,只能是因为根本就没有进入try,即在try之前的代码就已经异常了对于trycatchfinally结果,只要进入try了,无论如何,即使在try或者catch里面有return,finally内的代码都会执行!但是,有种情况需要注意:staticintTest(){inta=1;try{returna;}catch{a=2;returna;}finally{a=3;}returna;}1.最后的returna;其实是多余的,永远都不可能执行2.函数最后会返回1,但是finally内的a=3这行代码会执行同理,如果try里面引发了异常,如:staticintTest(){inta=1;try{thrownewException();returna;}catch{a=2;returna;}finally{a=3;}returna;}最终会返回2,但是finally内的a=3仍然会执行。这个是对于值类型而言,楼主有兴趣的话可以试试返回值为引用类型的情况
解决方案:
使用trycatchfinally结构的时候,对于catchfinally内的代码一定要谨慎,如果在catchfinally内又引发异常的话.........

时间: 2024-09-13 01:15:07

try..catch 为什么不执行finally的相关文章

try catch finally的执行顺序深入分析_java

首先执行try,如果有异常执行catch,无论如何都会执行finally 一个函数中肯定会执行finally中的部分. 关于一个函数的执行过程是,当有return以后,函数就会把这个数据存储在某个位置,然后告诉主函数,我不执行了,接下来你执行吧,所以函数就会推出. 但是当一个函数中出现finally以后,finally永远都要执行,所以,就算try或者catch中已经执行了return了,但是这时函数不会退出,不会告诉主函数去执行,而是等待finally执行完了才回去告诉主函数去执行,这时候如果

有return的情况下try catch finally的执行顺序

背景:          昨天一个朋友出去面试,遇到这么一道题:"C#  catch里有return,finally里还执行吗?" 个人实践小结:         1.不管有木有出现异常,finally块中代码都会执行.         2.当try和catch中有return时,finally仍然会执行.     具体案例如下(此处以没有返回值的函数进行验证):                 3.如果是值传递,finally中改变的值对try或catch块中return返回的值无影

Java异常及异常块执行次序(try、catch、finally、return)

Java异常: ①使用try-catch-finally处理异常: ②使用throw.throws抛出异常: ③上边为java异常处理5个关键字. 异常是程序在设计时或运行时产生的错误,异常处理是处理异常的过程,一旦异常被处理后,异常就不存在了,因此程序就可以继续运行了.如果异常不被处理,程序就会被强制终止(终止出现异常的业务代码执行). 在程序运行中,程序的try.catch.finally.return执行次序,就要进行考虑了. ①:捕获异常 try{ //执行可能产生异常的代码 }catc

C# dll事件中如何执行Javascript的回调函数

前言: 由于js 远程请求  XMLHttpRequest() 不支持多线程,所以用C# 写了个dll 多线程远程抓住供js调用. 最初代码为: C#代码 /// <summary> /// 异步请求入口 /// </summary> /// <param name="url">传入http地址 注意加http</param> /// <param name="timeoutStr">超时时间</pa

使用Try…Catch块进行T-SQL错误处理

SQL Server的错误处理或异常处理一直都是T-SQL开发中比较麻烦的部分.在过去,每一条语句运行后,你都要手动地进行错误检查,然后逐个错误的进行处理.SQL Server事务管理同样非常麻烦,你需要找出事务的状态,然后恰当的将其回滚或者提交. 而今,通过在SQL Server 2005中为T-SQL添加Try-Catch块,微软给我们提供了新的,更加健壮的错误处理能力.在本文中,我们将看到Try-Catch块是如何工作的,并告诉你如何你在代码使用他们.同时,我们还将提供一些使用以前的方法处

揭开JVM所看到的try/catch/finally

揭开JVM所看到的try/catch/finally 最近有一位朋友发了一段代码给我,这个方法很简单,具体内容大致如下: int num = 5000000;//500万 long begin = System.currentTimeMillis(); for(int i=0; i<num; i++){ try{ //do something }catch(Exception e){ } } long end = System.currentTimeMillis(); System.out.pr

无需写try/catch,也能正常处理异常

对于企业应用的开发者来说,异常处理是一件既简单又复杂的事情.说其简单,是因为相关的编程无外乎try/catch/finally+throw而已:说其复杂,是因为我们往往很难按照我们真正需要的策略来处理异常.我一直有这样的想法,理想的企业应用开发中应该尽量让框架来完成对异常的处理,最终的开发人员在大部分的情况下无需编写异常处理相关的任何代码.在这篇文章中我们将提供一个解决方案来让ASP.NET应用利用EntLib的异常处理模块来实现自动化的异常处理. 源代码: Sample1[通过重写Page的O

java-基础-try、catch和finally

1.try块中没有抛出异常,try.catch和finally块中都有return语句 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 public static int NoException(){          int i=10;          try{            System.out.println("i in try block is:"+i);            return --i;          }        

c#-C#中throw和try catch的区别是什么?throw是不是用的比较少?什么时候需要throw

问题描述 C#中throw和try catch的区别是什么?throw是不是用的比较少?什么时候需要throw C#中throw和try catch的区别是什么?throw是不是用的比较少?什么时候需要throw 解决方案 比如说,用整数表示人的年纪,那么负数就是非法的. 编写如下代码: int _age; public int Age { get { return _age; } set { if (value < 0) throw new InvalidParameterException(