我需要找出foreach
循环中当前Row索引的内容。
foreach (DataRow row in DataTable[0].Rows)
{
// I do stuff in here with the row, and if it throws an exception
// I need to pass out the row Index value to the catch statement
}
try/catch
块中的任何一点都可能发生异常,但是如果我在foreach
循环中使用增量计数器,并且异常发生在循环之外,我将无效因为我已经将指针移动了一个。
我知道我可以在DataRow
范围之外声明foreach
,但foreach
位于try/catch
范围内。我需要传递Row索引,以便我可以在catch
语句中使用它。我应该说我的DataTable
属于班级范围。
这真的是获取当前Row索引的唯一方法吗?或者是否有更清洁的实施?
修改
因此,考虑到这一点,我可以使用int
来存储当前行值,并像这样增加此值:
int i = 0;
try
{
// Some code here - which could throw an exception
foreach (DataRow row in DataTables[0].Rows)
{
// My stuff
i++;
}
// Some code here - which could throw an exception
}
catch
{
// Use the counter
DataRow row = DataTables[0].Rows[i];
}
但是,如果foreach
没有抛出异常,那么i
的值将大于表中的实际行数。显然,我可以在i--;
循环之后foreach
进行{{1}},但这似乎是真的脏黑客。
答案 0 :(得分:0)
在try之外声明一个计数器变量并为每次循环迭代递增:
int counter = 0;
try
{
foreach (DataRow row in DataTable[0].Rows)
{
// Do stuff
counter++
}
counter = -1;
// Do other stuff
}
catch
{
// Counter has index
if (counter == -1)
{
// exception did not occur in loop
}
else
{
// exception did occur in loop
}
}
答案 1 :(得分:0)
一种肮脏的方法是将其包装在另一个trycatch块中:
int i = 0;
try
{
// Some code here - which could throw an exception
try{
foreach (DataRow row in DataTables[0].Rows)
{
// My stuff
i++;
}
// Some code here - which could throw an exception
}
catch{
i--;
throw;
}
}
catch
{
// Use the counter
DataRow row = DataTables[0].Rows[i];
}
通过这种方式,你肯定知道异常会在foreach或者它之前被抛出,并且你总是得到正确的迭代器。