1

我想知道是否有办法从方法/函数的调用者那里获取“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

4

1 回答 1

0

只需运行您发布的此代码,它似乎正在做您想做的事。下面是调用者捕获和处理它的示例。如果你想在你的测试函数中处理这些,你只需将 try catch 向下移动。

public class Program
{
    public static void Main(string[] args)
    {
        try
        {
            Main m = new Main();
            m.Test();
        }
        catch (Exception e)
        {
            Console.Write("Uh oh :O " + e.StackTrace);
        }
    }
}

编辑:好的,在看了这个之后,我想出了一种方法来做你所要求的。您必须设置一个 DebugerHidden 属性。例子:

        public T this[XYZ xyz]
        {
            //add attribute here to say this function is 'ignored'
            [DebuggerHidden]
            get
            {
                if (OutOfBounds(xyz))
                {
                    throw new ArgumentOutOfRangeException(); // Error shows here in debug
                }
                else
                {
                    return data[xyz.X, xyz.Y, xyz.Z];
                }
            }
            //add attribute here to say this function is 'ignored'
            [DebuggerHidden]
            set
            {
                if (OutOfBounds(xyz))
                {
                    throw new ArgumentOutOfRangeException(); // Error shows here in debug
                }
                else
                {
                    data[xyz.X, xyz.Y, xyz.Z] = value;
                }
            }
        }
于 2013-02-24T03:15:30.430 回答