C#向调用者抛出异常

时间:2015-02-11 15:20:15

标签: c# exception throws

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

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
}

3 个答案:

答案 0 :(得分:1)

所描述的行为并非严格可行,但解决所需的效果是。

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

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

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

答案 1 :(得分:1)

经过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
}

答案 2 :(得分:-1)

这个怎么样?

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

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