emma自身的代码在处理合并覆盖率时,容错性不够,代码处理上也不完善,两处TODO也表明代码的逻辑处理还不够完善:
- // merge all data files:
- try
- {
- final long start = log.atINFO () ? System.currentTimeMillis () : 0;
- for (int f = 0; f < m_dataPath.length; ++ f)
- {
- final File dataFile = m_dataPath [f];
- if (verbose) log.verbose ("processing input file [" + dataFile.getAbsolutePath () + "] ...");
- final IMergeable [] fileData = DataFactory.load (dataFile);
- final IMetaData _mdata = (IMetaData) fileData [DataFactory.TYPE_METADATA];
- if (_mdata != null)
- {
- if (verbose) log.verbose (" loaded " + _mdata.size () + " metadata entries");
- if (mdata == null)
- mdata = _mdata;
- else
- mdata = (IMetaData) mdata.merge (_mdata); // note: later datapath entries override earlier ones
- }
- final ICoverageData _cdata = (ICoverageData) fileData [DataFactory.TYPE_COVERAGEDATA];
- if (_cdata != null)
- {
- if (verbose) log.verbose (" loaded " + _cdata.size () + " coverage data entries");
- if (cdata == null)
- cdata = _cdata;
- else
- cdata = (ICoverageData) cdata.merge (_cdata); // note: later datapath entries override earlier ones
- }
- ++ m_dataFileCount;
- }
- if (log.atINFO ())
- {
- final long end = System.currentTimeMillis ();
- log.info (m_dataFileCount + " file(s) read and merged in " + (end - start) + " ms");
- }
- if (((mdata == null) || mdata.isEmpty ()) && ((cdata == null) || cdata.isEmpty ()))
- {
- log.warning ("nothing to do: no metadata or coverage data found in any of the input files");
- // TODO: throw exception or exit quietly?
- return;
- }
- }
- catch (IOException ioe)
- {
- // TODO: handle
- ioe.printStackTrace (System.out);
- }
这里的问题是:如果粉红色底纹的语句抛出异常,将直接跳过灰色底纹(蓝色字体)语句块的检查,这将导致检查失效,最后导致mdata和cdata同时为null,在到后面处理的时候,抛出了java.lang.IllegalArgumentException: null input: data异常。
修改后的代码(灰色底纹部分是我新增或者修改的代码):
- // merge all data files:
- try
- {
- final long start = log.atINFO () ? System.currentTimeMillis () : 0;
- for (int f = 0; f < m_dataPath.length; ++ f)
- {
- final File dataFile = m_dataPath [f];
- if (verbose) log.verbose ("processing input file [" + dataFile.getAbsolutePath () + "] ...");
- // 五和:容错处理:如果DataFactory.load失败(load异常),说明em和ec文件存在损坏,合并过程跳过此文件。
- IMergeable [] fileData = null;
- try {
- fileData = DataFactory.load (dataFile);
- } catch(IOException ioe) {
- // 五和:跳过异常em和ec文件的处理
- continue;
- }
- if (fileData == null) {
- continue;
- }
- final IMetaData _mdata = (IMetaData) fileData [DataFactory.TYPE_METADATA];
- if (_mdata != null)
- {
- if (verbose) log.verbose (" loaded " + _mdata.size () + " metadata entries");
- if (mdata == null)
- mdata = _mdata;
- else
- mdata = (IMetaData) mdata.merge (_mdata); // note: later datapath entries override earlier ones
- }
- final ICoverageData _cdata = (ICoverageData) fileData [DataFactory.TYPE_COVERAGEDATA];
- if (_cdata != null)
- {
- if (verbose) log.verbose (" loaded " + _cdata.size () + " coverage data entries");
- if (cdata == null)
- cdata = _cdata;
- else
- cdata = (ICoverageData) cdata.merge (_cdata); // note: later datapath entries override earlier ones
- }
- ++ m_dataFileCount;
- }
- if (log.atINFO ())
- {
- final long end = System.currentTimeMillis ();
- log.info (m_dataFileCount + " file(s) read and merged in " + (end - start) + " ms");
- }
- if (((mdata == null) || mdata.isEmpty ()) && ((cdata == null) || cdata.isEmpty ()))
- {
- log.warning ("nothing to do: no metadata or coverage data found in any of the input files");
- // TODO: throw exception or exit quietly?
- return;
- }
- }
- catch (Exception ex) // 处理merge异常
- {
- // 捕获merge异常,并通过邮件报告给开发人员。
- throw new EMMARuntimeException (UNEXPECTED_FAILURE,
- new Object [] {ex.toString (), IAppConstants.APP_BUG_REPORT_LINK},
- ex);
- }