日期:2014-05-18  浏览次数:20823 次

IndexOutOfRange异常不能再现(40分)
各位前辈你们好!
今天在系统上线之后,用户反映出一个问题。
就是:
indexoutofrangeexception:在位置-1处没有任何行。

根据用户执行的操作。我回到自己的开发环境中用断点跟踪。发现完全没有问题。
而其中唯一可能出现用-1定位tables的地方就是一个if判断语句的失效情况。

if (sqlValidate(-1, this.menu.SelectedValue, _Content)){执行保存操作}
sqlValidate 函数定义如下
public bool sqlValidate(int ID, string Wei_ID, string Content)
{
  BLL.Wei_D bllD = new BLL.Wei_D();
  int Wei_id = int.Parse(Wei_ID.Trim());
  if (!bllD.ExistsD(ID, Wei_id, Content)){一些执行提示的语句以及renturn}
}

ExistsD定义如下
  public bool ExistsD(int ID, int Wei_ID, string DContent)
  {
  if (ID != -1)
  {
  Model.Wei_D modelD = new Model.Wei_D();
  BLL.Realation_Wei_D bllrgd = new Realation_Wei_D();
  DataSet ds = new DataSet();
  ds = bllrgd.GetList(" Wei_ID=" + Wei_ID.ToString() + "and D_ID <>" + ID.ToString());
  for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
  {
  string strID = ds.Tables[0].Rows[i][ds.Tables[0].Columns.Count - 1].ToString();
  modelD = GetModel(int.Parse(strID));
  if (modelD.D_Content == DContent)
  return false;
  }
  return true;
  }
  else {
  return !(dal.ExistsD(Wei_ID, DContent));
  } 
  }

整个过程中,除了ID变量被我赋值为-1,没有其他任何变量的值为-1.
如果说,在-1处出现问题,那么只能是if(ID!=-1)判定失败(我自己推测)。
但是,我觉得自己想的太不靠谱了。
所以上来问问各位前辈。
这种在客户那边随机出现的问题,应该如何再现?
应该如何解决呢?

------解决方案--------------------
日志记录exception和context
------解决方案--------------------
你的假设有误区,if(ID!=-1)判定失败的可能性是不存在的。
就你贴出来的那点代码,问题很可能在下面2行中的一处:
string strID = ds.Tables[0].Rows[i][ds.Tables[0].Columns.Count - 1].ToString();
modelD = GetModel(int.Parse(strID));

如果这里ds.Tables[0].Columns.Count == 0,那么第一行代码将报错。
如果第二行的GetModel内部有问题,执行GetModel也可能报错。