【问题标题】:Where to best place a throw in code在哪里最好放置代码
【发布时间】:2015-09-19 21:24:00
【问题描述】:

我正在编写一些基于网络中多个来源的异常处理最佳实践。从微软网页 (https://msdn.microsoft.com/en-us/library/seyhszts(v=vs.110).aspx) 我得到了推荐:

“堆栈跟踪从抛出异常的语句开始,到捕获异常的 catch 语句结束。在决定放置 throw 语句的位置时要注意这一点。”

我不太清楚这意味着什么。我们可以说“投掷”的最佳位置是尽可能靠近所讨论的电话吗?这是正确的还是有人有其他建议?

编辑:我会更准确。请看下面的伪代码

    // do something that assignes a value to 'someValue'

    // do more that's not related to the call above

    if (someValue == whatever)
    {
        throw new MyException();
    }

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

【问题讨论】:

  • 抱歉,这可能听起来很粗鲁,但如果您不明白这意味着什么,那么您可能不适合定义“最佳”实践。
  • 在不适用进一步工作的地方抛出异常,这通常是发生错误的地方。
  • 最好的地方?当然是在 try 块内,或者在 try 块内执行的任何方法。我的意思是,你还会把它放在哪里?
  • @DavidArno:这不是那么粗鲁,只是诚实;-)。这就是为什么我把这个问题放在这里是为了使它成为一种最佳实践,而不仅仅是从网络上复制一些建议。
  • 我想要更精确。参见下面的伪代码: // 做一些为 'someValue' 赋值的事情 // 做更多与上面的调用无关的事情 if (someValue == whatever) { throw new MyException(); }

标签: c# exception-handling throw


【解决方案1】:

“堆栈跟踪从抛出异常的语句开始,到捕获异常的 catch 语句结束。在决定放置 throw 语句的位置时要注意这一点。”

如果以下代码未包装在 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;
    }

【讨论】:

    猜你喜欢
    • 2015-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多