漫谈:exception比goto强在哪?还不如if else呢!

初级代码游戏的专栏介绍与文章目录-CSDN博客

        最近对异常处理比较气愤。因为引发了一些BUG……

        “异常处理不是用来避免BUG的吗?”,他们这样说的,但是异常处理确实引发了BUG。

目录

如果代码需要优雅,你为什么不去跳芭蕾?


        看看下面的代码:


			try
			{
				StreamReader streamReader = new StreamReader(file_name);
				n = long.Parse(streamReader.ReadLine());
                。。。。。。
				streamReader.Close();
			}
			catch (Exception ex)
			{
				Log("读取文件出错:" + ex);
				WriteFile();
			}

        打开文件、读文件、关闭文件,如果异常就重新生成文件,“WriteFile();”也是相同的逻辑,操作同一个文件,只不过换成了StreamWriter对象。

        看起来什么问题都没有,如果文件不存在(比如第一次运行),会抛出异常,然后进入异常处理,大部分情况下确实如此,直到我修改了文件格式,导致读文件出错同时异常处理中生成文件的代码也出错——程序BUG了。

        异常信息表示,第一次是读文件异常(因为已经到达文件尾,能够理解,因为格式变了),第二次是打开文件异常,文件被占用,这是为什么?

        仔细分析一下执行流程:

			try
			{
				StreamReader streamReader = new StreamReader(file_name);
				n = long.Parse(streamReader.ReadLine());------此处异常,跳转到异常处理
                。。。。。。
				streamReader.Close();------此句被跳过,文件仍然是打开的
			}
			catch (Exception ex)
			{
				Log("读取文件出错:" + ex);
				WriteFile();------这里无法再次打开文件
			}

        原因不复杂,就是因为异常导致后面的文件关闭没有执行。

        为了解决这个BUG,必须修改代码:

            StreamReader streamReader = null;------在try块之外定义变量
			try
			{
				streamReader = new StreamReader(file_name);
				n = long.Parse(streamReader.ReadLine());
                。。。。。。
				streamReader.Close();
			}
			catch (Exception ex)
			{
                if (null != streamReader) streamReader.Close();------先关闭文件
				Log("读取文件出错:" + ex);
				WriteFile();
			}

        这样BUG就解决了。很easy。

        但是,如果需要这样复杂的代码结构,异常处理跟判断返回值相比有什么好处呢?好好的一段代码硬被分成三块(变量定义、正常处理、出错处理),这和goto有什么区别?

        异常处理就是为了讨好懒惰的程序员,不用写返回值判断,统统一个catch解决,程序质量大幅提高:虽然结果仍然不正确,但是不会异常退出了。这不是掩耳盗铃吗?

       

如果代码需要优雅,你为什么不去跳芭蕾?

(这里是结束)

  • 27
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值