C# 向调用者抛出异常

C# throw exception to caller

我有一个需要抛出异常的函数,但我希望它将该异常抛出到我调用该函数的行:

static int retrieveInt()
{
    int a = getInt();
    if(a == -1)
        throw new Exception("Number not found"); //The runtime error is pointing to this line
    return a;
}

static void Main(string[] args)
{
     int a = retrieveInt(); //The runtime error would be happening here
}

所描述的行为严格来说是不可能的,但可以通过变通来达到预期的效果。

您 运行 遇到的问题是,在 Visual Studio 中,执​​行暂停,我们从最可用的位置看到带有调试信息的异常。对于框架方法,这意味着方法调用,即使在更深层次的调用中抛出了异常。由于异常来自您正在调试的同一个项目,因此您将始终拥有实际 throw 行的调试信息,因此您将始终到达该行。

这里的解决方法是利用 VS 中的 Call Stack window,这将在触发错误的方法调用下方包含几行,双击它会带您到哪里你想要的,包括调用时的所有局部变量。这类似于框架异常行为,因为如果您查看堆栈跟踪,有几个帧被标记为 "external" 因为它们没有调试信息。

编辑: 要添加一些关于 trycatch 行为的信息,catch 将响应任何尚未捕获的异常- 因此,即使异常被抛出更深的几个调用,如果在调用堆栈展开到你的 try 块时它没有被处理,它会命中适当的 catch 块(如果有一个).

这个怎么样?

public static int NewInt
{
    get
    {
            throw new Exception("Number not found");
    }
}

static void Main(string[] args)
{
    int a = NewInt;
}

经过 2 小时的搜索,我找到了问题的答案。要执行我想要的操作,需要在函数之前使用 [System.Diagnostics.DebuggerStepThrough]:

[System.Diagnostics.DebuggerStepThrough]
static int retrieveInt()
{
    int a = getInt();
    if(a == -1)
        throw new Exception("Number not found"); //The runtime error will not be here
    return a;
}

static void Main(string[] args)
{
     int a = retrieveInt(); //The runtime error happens now here
}