捕获/抛出堆栈跟踪丢失了错误的行号

4

我尝试了几种方法来保持抛出异常时堆栈跟踪中的正确行号。最常见的是捕获并抛出,但这并不起作用。以下是我尝试过的几种方法:

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;
}

所有的错误都在 throw 行和消息框行上报告,而不是在除以 0 的那一行上报告。如果我在 test() 函数内部打断点,可以显示正确的行号,但在被抛出后却无法显示。唯一有效的方法是在 test() 函数中不使用任何 try/catch。但是,当然我希望能够捕获错误并重新抛出它们,并保持堆栈跟踪正确。那么该怎么做呢?谢谢。

抛出新的异常("查看InnerException", ex); 捕获器可以查看捕获的异常的InnerException属性,以查看原始堆栈跟踪等。 - 15ee8f99-57ff-4f92-890c-b56153
https://dev59.com/0nVD5IYBdhLWcg3wTZxm - hatchet - done with SOverflow
实际上更接近于https://dev59.com/XnVD5IYBdhLWcg3wL4mM...但惊讶的是,`ExceptionDispatchInfo`在那个@hatchet的评论中只被提到了。 - TylerY86
3个回答

3

多么悲伤,“ Here's why.” 变成了一个无效链接。 - Beauty

1
在发布时,您将无法获得行号,因为行号是从包含编译所有符号的*.pdb文件中检索出来的。
因此,如果您计划在发布/生产中获取精确的行号,则必须复制pdb文件。

0

最简单的方法是直接在测试中删除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);
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接