我正在基于网络中的多个来源编写一些异常处理最佳实践。从Microsoft网页(https://msdn.microsoft.com/en-us/library/seyhszts(v=vs.110).aspx)我得到了建议:
"堆栈跟踪从抛出异常的语句开始,并以捕获异常的catch语句结束。在决定将抛出语句放在何处时,请注意这一事实。"
我并不真正意味着这意味着什么。我们能说出最好的地方吗?是否尽可能接近有问题的电话?这是正确的还是有人有其他建议吗?
编辑:我会更精确。请参阅以下伪代码
// do something that assignes a value to 'someValue'
// do more that's not related to the call above
if (someValue == whatever)
{
throw new MyException();
}
我假设当我在有问题的调用之后做了别的事情之后抛出异常(做某事),我不会得到正确的堆栈跟踪指向我的右边行。我是对的吗?
答案 0 :(得分:0)
"堆栈跟踪从抛出异常的语句开始,并以捕获异常的catch语句结束。在决定将抛出语句放在何处时,请注意这一事实。"
如果以下代码未包含在try-catch
块中,则调试器将为您提供堆栈跟踪,其中最顶层的项指向DivideTwoNumbers()
函数,因为它是发生异常的位置。此行之后的所有其他代码:double quotient = DivideTwoNumbers(10, 0);
将不会执行,这意味着您拥有的所有其他throw语句将毫无用处。假设您期望AnotherFunction()
内有异常,您是否会捕获异常或将AnotherFunction()
包含在堆栈跟踪中?答案是否定的。
static void Main(string[] args)
{
try
{
double quotient = DivideTwoNumbers(10, 0);
AnotherFunction();
}
catch (DivideByZeroException ex)
{
Console.WriteLine(ex.Message);
}
Console.ReadLine();
}
static int DivideTwoNumbers(int dividend, int divisor)
{
if (divisor == 0)
throw new DivideByZeroException();
return dividend / divisor;
}