问题描述
就像我现在一样,为了保持原来的 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
并删除其他来源?
解决方法
1.为什么 stackTrace 为第 17,34 行添加源?
不是其他 sources
,而是 stack
跟踪显示导致异常的跟踪。
正如名称 StackTrace
所暗示的,它不是一个点,同样它是一个 path
。
2.在代码中我应该怎么做让stackTrace指向第41行并删除其他来源?
您不能,因为您的问题来自对存在 stackTrace 的误解。
,“我应该在代码中做什么才能让 stackTrace 指向第 41 行并删除其他源?”
没在第 34 行看到吗?
您应该只捕获您知道如何处理的异常。如果您曾经使用过 catch()
或 catch(Exception)
,那么您可能错了(除非是为了记录而您重新抛出)。
请记住,例外是“昂贵的”。你应该尽量避免它们。除以零是每个停止,如果你的代码有一个零除数是“正常的”,那么这不是一个例外,应该用 if
捕获。