我想知道是否有办法从方法/函数的调用者那里获取“ArgumentOutOfRangeException”:
几天来一直在寻找这个,但没有运气......要么是罕见的,要么是搜索参数的错误选择......
例子:
class Main
{
struct XYZ
{
public int X, Y, Z;
public XYZ(int x, int y, int z)
{
X = x;
Y = y;
Z = z;
}
}
class ArrayE<T>
{
public T[, ,] data;
public ArrayE(XYZ xyz)
{
data = new T[xyz.X, xyz.Y, xyz.Z];
}
public T this[XYZ xyz]
{
get
{
if (OutOfBounds(xyz))
{
throw new ArgumentOutOfRangeException(); // Error shows here in debug
}
else
{
return data[xyz.X, xyz.Y, xyz.Z];
}
}
set
{
if (OutOfBounds(xyz))
{
throw new ArgumentOutOfRangeException(); // Error shows here in debug
}
else
{
data[xyz.X, xyz.Y, xyz.Z] = value;
}
}
}
bool OutOfBounds(XYZ xyz)
{
return xyz.X < 0 | xyz.Y < 0 | xyz.Z < 0 |
xyz.X >= data.GetLength(0) |
xyz.Y >= data.GetLength(1) |
xyz.Z >= data.GetLength(2);
}
}
ArrayE<int> Data;
public void Test()
{
XYZ xyz = new XYZ(10, 10, 10);
Data = new ArrayE<int>(xyz);
xyz = new XYZ(1,0,2);
Data[xyz] = 2;
xyz = new XYZ(1, -1, 2);
Data[xyz] = 4; // I would like the debugger to stop here
//As if I did this:
Data[xyz.X,xyz.Y,xyz.Z] = 4 // The debugger would then stop at this line
//Example of what I want
int[] array = new int[10];
array[2] = 1;
array[-1] = 3; // This is the behavior I would like to happen when out of bounds, The error shows here.
}
}
编辑:更具体:
当我开始调试时,我希望调试器在“Data[xyz] = 4;”行停止 其中 xyz 是无效索引,所以我可以看到它是从哪里调用的,而不是从 Data[xyz] get set 函数内部。
如果常规的 int[] 会得到一个无效的索引,例如 -1,那么调试器会在该行停止,您可以查看访问数组之前的行,这样就可以找出索引的原因就是这样。在当前设置下,当在 ArrayE[xyz] 上使用无效的 xyz 索引时,调试器会在 get 集中停止,这使我无法跟踪并找出 xyz 超出数组边界的原因......
希望它更清楚,至于我在问什么。
我可以使用try catch,但没有其他方法吗?执行 try catch 会很快使代码变得不可读和难以管理,因为程序非常大......
那么,如果可能的话,怎么做呢?
我正在使用 Visual C# 2010 Express