问题描述
请大神帮我看看,这一段代码抛出异常之后,为什么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内又引发异常的话.........