何时捕获异常?

时间:2010-11-05 10:30:08

标签: c++ exception-handling

如果我在不使用例外的情况下执行以下操作会有什么不同吗?

void func()
{
    try
    {
        if (n > 5)
        {
            throw "n is greater than 5";
        }
    }
    catch (const char *e)
    {
        MessageBox(0, e, 0, 0);
        return;
    }
}

OR

void func()
{
    if (n > 5)
    {
       MessageBox(0, "n is greater than 5", "Error", 0);
       return;
    }
}

9 个答案:

答案 0 :(得分:8)

我可能会说你最好建议不要使用流量控制的例外。顾名思义,例外情况是处理特殊情况。在上面的例子中,你显然希望n可能是> 5所以这不是一个特殊的情况。如果您的应用程序有办法处理该案例,那么它应该优先于提出异常。

我确信有些情况下逻辑会下降,但总的来说,我认为这是一个很好的经验法则。

但从技术角度来说,没有太大差异(如果你做了很多的话,可能会有表现)。

答案 1 :(得分:3)

永远不要抛出异常然后捕获相同的函数。这表明您正在使用标准控制流的异常,最好使用if / while / break / etc。

答案 2 :(得分:2)

最终结果将完全相同,这是肯定的。

你应该尽量在代码中简化一些事情,所以我强烈反对在这种情况下使用异常。

答案 3 :(得分:2)

很难准确说出何时应该使用例外。在某些情况下,例外是明显的赢家,而在其他情况下则不是。

问题的核心是n来自哪里,在正常情况下,它可能是一个值> 5.如果n由函数本身计算并且通常可以具有该值,则异常感觉不正确。但是,如果n在其他地方指定,并且此函数不期望高值,则异常感觉更正确。

但是,我要说的例子是对异常的错误使用。在同一个函数中抛出和捕获异常几乎总是坏的形式。这是标准的流量控制。当错误条件需要在函数外部传播时,应该使用异常。

答案 4 :(得分:0)

你的例子没有真正的区别(除了显而易见的事实,一个人使用例外而另一个人没有!) - 这将是一个合理的重构。但是,如果存在许多不同的错误条件,您可能会发现throw... catch模式可以帮助您将错误处理保存在一个位置。

答案 5 :(得分:0)

在您的示例中,没有区别。你必须要弄清楚的是,当抛出异常时,发现的其余语句中的try ... catch方法将永远不会被执行。 Exceptions基本上用于处理“改变程序正常执行流程的特殊条件”。 (你的基本是正常的逻辑错误流)。

希望这有帮助。

答案 6 :(得分:0)

void func()
{
    if (n > 5)
    {
       MessageBox(0, "n is greater than 5", "Error", 0);
       return;
    }
}

如果您可以通过上述代码之类的支票自行处理,请不要自行抛出异常,这不是一个好习惯。

答案 7 :(得分:0)

您没有定义n

使用以下n的定义,有不同的可观察行为:

struct Silly
{
    ~Silly() { cout << "Hm de dum" << endl; }
    operator bool() const { return true; }
};

struct SillyProducer
{
    Silly operator>( int ) const { return Silly(); }
};

#define n   Silly silly = SillyProducer()

干杯&amp;第h。,

答案 8 :(得分:0)

已经说了很多,我只想在我这边添加一些东西。

在你的情况下,两种情况都是正确的,除了我鼓励将它分成两层:逻辑和视图。所以你的逻辑层会这样做:

    doLogic()
    {
      if (n > 5)
      {
         throw "n is greater than 5";
      }
      ///Something more
    }

并且您的视图图层可能会执行以下操作:

try
{ 
   doLogic()
}
catch (const char *e)
{
    MessageBox(0, e, 0, 0);
    return;
}

但是,正如其他人所说的那样:最重要的是n来自哪里。如果您希望它超过5,那么只需使用if()else,而不是异常。但是,如果n 总是小于5,如果n大于5意味着系统出现问题,则使用异常。