重新抛出异常时的堆栈跟踪行为 c#

时间:2021-05-13 13:25:53

标签: c# try-catch stack-trace throw

就像我现在一样,为了保持原来的 stackTrace 我们应该避免使用 throw 捕获的异常,相反,我们应该使用 throw {{ 1}} 实际上 clause 例外。

问题是,在几天的面试中,我得到了一个代码来预测最终结果的rethrow

stacktrace

异常发生在 class Program { static void Main(string[] args) { try { ReThrowException(); // line 17 } catch (Exception x) { Console.WriteLine("Exception:"); Console.WriteLine(x.StackTrace); //line 22 } } private static void ReThrowException() { try { DivByZero(); } catch { throw; //line 34 } } private static void DivByZero() { int x = 0; int y = 1 / x; //line 41 } } 中,在第 34 行,它只是通过保留原始 line 41 来实现 rethrow 异常。

我的回答是:

<块引用>

它只是应该指向 stackTrace where 异常实际上 第一次发生,line 41 无处覆盖 代码。

但真正的答案如下:

stackTrace

现在我想到了两个问题:

1.为什么 Exception: at TestConsole.Program.DivByZero() in C:...\Projects\TestConsole\TestConsole\Program.cs:line 41 at TestConsole.Program.ReThrowException() in C:...\Projects\TestConsole\TestConsole\Program.cs:line 34 at TestConsole.Program.Main(String[] args) in C:...\Projects\TestConsole\TestConsole\Program.cs:line 17 为行 stackTrace 添加源?
2.我应该如何在代码中只将 17,34 指向 stackTrace 并删除其他来源?

2 个答案:

答案 0 :(得分:2)

<块引用>

1.为什么 stackTrace 为第 17,34 行添加源?

不是其他 sources,而是 stack 跟踪显示导致异常的跟踪。 正如名称 StackTrace 所暗示的,它不是一个点,同样它是一个 path

<块引用>

2.在代码中我应该怎么做让stackTrace指向第41行并删除其他来源?

您不能,因为您的问题来自对存在 stackTrace 的误解。

答案 1 :(得分:-1)

“我应该在代码中做什么才能让 stackTrace 指向第 41 行并删除其他源?”

没在第 34 行看到吗?

您应该只捕获您知道如何处理的异常。如果您曾经使用过 catch()catch(Exception),那么您可能错了(除非是为了记录而您重新抛出)。

请记住,例外是“昂贵的”。你应该尽量避免它们。除以零是每个停止,如果你的代码有一个零除数是“正常的”,那么这不是一个例外,应该用 if 捕获。

相关问题