catch / throw stack trace丢失错误行号

时间:2016-09-29 19:29:06

标签: c# try-catch

我已经尝试了几种关于如何在抛出异常时在堆栈跟踪中保留正确的行号的建议。最常见的只是捕捉和投掷,但这不起作用。以下是我尝过的一些内容:

private void button1_Click(object sender, EventArgs e)
{
    try
    {
        test();
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.ToString());
    }
}
private void test()
{
    try
    {
        int a = 1;
        int b = 0;
        int x = 0;
        x = a / b;
    }
    catch 
    {
        throw;
    }
}

关于catch块的一些变化。

catch (Exception)
{
    throw;
}

catch (Exception e)
{
   throw;
}

catch (Exception e)
{
    throw e;
}

所有这些都报告了抛出线和消息框行的错误 - 从不在除以0的行上。如果我在test()函数内部,它确实显示了正确的行#,但在被抛出后不。唯一有效的方法是在test()函数中没有任何try / catch。但是我当然希望能够捕获错误并重新抛出错误并保持堆栈跟踪正确。那怎么办呢?

谢谢。

4 个答案:

答案 0 :(得分:0)

在发布时间中,您将没有行号,因为从包含所有编译符号的*.pdb文件中检索了行数。
因此,如果您计划在发布/生产中获取确切的行号,则必须复制pdb文件

答案 1 :(得分:0)

最简单的方法是简单地删除test中的try catch。如果这不是一个选项,如上面的注释所述,您可以抛出一个新的异常,传入旧的异常并查找实际堆栈跟踪信息的内部异常。

private void button1_Click(object sender, EventArgs e)
{
    try
    {
        test();
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.InnerException.ToString());
    }
}

public void test()
{
    try
    {
        int a = 1;
        int b = 0;
        int x = 0;
        x = a / b;
    }
    catch (Exception e)
    {
        throw new Exception("inner exception", e);
    }
}

答案 2 :(得分:0)

您想要ExceptionDispatchInfo.Capture(ex).Throw();

Here's why.

这可能与此other question重复。

答案 3 :(得分:0)

TylerY86的回答对我有用。当错误冒出时,它会提供许多额外的东西,但它确实提供了正确的行#。

谢谢!