抛弃代码

时间:2015-07-02 11:14:00

标签: c# exception-handling throw

我正在基于网络中的多个来源编写一些异常处理最佳实践。从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();
    }

我假设当我在有问题的调用之后做了别的事情之后抛出异常(做某事),我不会得到正确的堆栈跟踪指向我的右边行。我是对的吗?

1 个答案:

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