catch所有提示的异常类型,程序执行异常时却还是没有报错,异常没有被catch到吗[已解决]

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/qq_41885819/article/details/102504186

有时候调试程序的时候,真的是会让人心态有点崩溃,没有捕获到错误,但是程序运行出来的结果就是不对。按照我同事的话说:“我的代码有它自己的思想”。

今天的情况是,在同步一个订单时,会先同步头表,再同步行表。执行后提示正常,但是只提示同步头表成功,行表没进行同步,程序就结束了。部分代码如下:

		// 同步ASN到货单头
		OmOrderDeliverHeaderSynService omOrderDeliverHeaderSynService = new OmOrderDeliverHeaderSynService();
		if (omOrderDeliverHeaderSynService.dosyn(db, ac) < 0) {
			ac.getActionResult().setSuccessful(false);
			ac.getActionResult().addErrorMessage("ASN到货单头同步时出现异常!");
			return;
		}

		// 同步ASN到货单行
		OmOrderDeliverLinesSynService omOrderDeliverLinesSynService = new OmOrderDeliverLinesSynService();
		if (omOrderDeliverLinesSynService.dosyn(db, ac) < 0) {
			ac.getActionResult().setSuccessful(false);
			ac.getActionResult().addErrorMessage("ASN到货单行同步时出现异常!");
			return;
		}

给我的感觉是程序运行到第5行后直接返回了。那就意味着同步的数据条数<0,及单据头同步时出现了异常。下面是单据头同步时部分代码:

//前面省略若行代码
	ac.getActionResult().addSuccessMessage(
					"ASN到货单头同步新增数据" + insertCount + "条,更新数据" + updateCount
							+ "条!");
	ac.getActionResult().addSuccessMessage("同步耗时:"+DateFormateUtil.getTimeCost(endTime, beginTime)+"(s)");

	return 0;
		} catch (JDBCException e) {
			logger.error(e.getMessage());
			try {
				db.execute("rollback");
			} catch (JDBCException e1) {
				logger.error(e1.getMessage());
			}
			return -4;
		} catch (ParseException e) {
			logger.error(e.getMessage());
			try {
				db.execute("rollback");
			} catch (JDBCException e1) {
				logger.error(e1.getMessage());
			}
			return -5;
		}catch (Exception e) {
			logger.error(e.getMessage());
			try {
				db.execute("rollback");
			} catch (JDBCException e1) {
				logger.error(e1.getMessage());
			}
			return -6;
		} finally {
			// 记录日志信息
			InterfaceLogDao.insertInterfaceLog(db, logBean);
		}

页面显示同步成功,那第一行代码肯定执行到了。其实最开始,所有捕获异常我都返回的-4,还没怎么发现错在哪儿,后面改成不一样的错误代码后,发现返回值为-6。当时多多少少有些惊讶。将最后一个catch (Exception e){ }给去掉后,程序没有编译错误,说明这个类的所有异常都是捕获到了的。然后将目光锁定同步耗时的那行代码上,下面是对应方法部分代码。

	public static float getTimeCost(String endTime , String beginTime) throws ParseException{
		//开始时间
		long beginSecond = Long.parseLong(beginTime);
		//结束时间
		long endSecond = Long.parseLong(endTime);
		//花费时间
		return ((float) (endSecond - beginSecond)/1000f);
		
	}

结合错误提示,应该是将字符串转换成long类型的时候出的问题,比如2019-10-11 10:10:10这个字符串转换的时候就会报错。然后将代码修改至如下,则成功解决问题。

	public static float getTimeCost(String endTime , String beginTime) throws ParseException{
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");		
		//开始时间
		long beginSecond = sdf.parse(beginTime).getTime();
		//结束时间
		long endSecond = sdf.parse(endTime).getTime();
		//花费时间
		return ((float) (endSecond - beginSecond)/1000f);
		
	}

**总结:**其实,在最开始编写代码的时候,运行效果就有点不理想,执行时间一直不显示,但是执行状态显示是正常的,又因为只是一个小小的提示语句,就没有多在意它。后面是因为将两个同步代码合二为一,只执行前面一个,后面一个不执行,才发现了这个藏得比较深的bug。所以,代码永远是不会撒谎的。另外需要注意的一点就是,如果在第二部分代码块里面不加catch (Exception e){ }的话,程序可以像之前一样执行,没有执行时间的提示,同步正常进行,那这个bug就要藏更久了,所以,还是要养成这个习惯。

猜你喜欢

转载自blog.csdn.net/qq_41885819/article/details/102504186