C++ 何时捕获异常?

C++ 何时捕获异常?,c++,exception-handling,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; } } 或 在您的示例中没有真正的区别(

如果我在不使用异常的情况下执行以下操作,会有什么不同吗

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


在您的示例中没有真正的区别(除了一个使用异常而另一个不使用异常这一明显事实之外!)-这将是一个合理的重构。但是,如果存在许多不同的错误条件,您可能会发现
抛出。。。catch
模式帮助您将错误处理保持在一个位置。

最终结果肯定是完全相同的


您应该尽量简化代码,因此我强烈反对在这种情况下使用异常。

我可能会说,您最好不要将异常用于流控制。例外,顾名思义,是用来处理特殊情况的。在上面的例子中,您显然期望n可能大于5,因此这不是一个真正的例外情况。如果您的应用程序有办法处理这种情况,那么它应该这样做,而不是引发异常

我相信在某些情况下,这种逻辑是错误的,但总的来说,我认为这是一个很好的经验法则


但是从技术角度讲,没有太大的区别(如果你做得太多,可能会有性能)。

在你的例子中,没有区别。唯一需要弄清楚的是,当抛出异常时,try…catch方法中发现的其余语句将永远不会执行。基本上是用来处理“改变正常程序执行流程的特殊情况”(你的只是一个基本的正常逻辑错误流程)

希望这有帮助

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

不要自己抛出异常,如果您可以通过上述代码这样的检查自己处理异常,这不是一个好的做法。

很难说什么时候应该使用异常。在某些情况下,例外情况是明显的赢家,而在其他情况下则不是

问题的核心是
n
从何而来,在正常情况下,它是否可以是一个大于5的值。如果n是由函数本身计算的,并且通常可以有这个值,那么异常感觉不正确。但是,如果在其他地方指定了n,并且此函数不期望高值,则异常感觉更正确


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

切勿抛出然后在同一函数中捕获的异常。这表明您正在对标准控制流使用异常,最好使用if/while/break/etc。

您没有定义
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()
struct
{

~dully(){cout已经说了很多,我只想从我这边补充一些

在您的情况下,这两种情况都是正确的,但我鼓励您将其分为两个层:逻辑层和视图层。因此,您的逻辑层可以:

    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()否则,不是异常。但是如果n总是小于5,如果大于5意味着系统有问题,那么就使用异常。

在第一种情况下,你会因为抛出一个
字符常量*
而被丢弃。可能是标题“错误”的不同在逆向工程中,代码……阿尔夫:通常你永远不应该说“不”。这是唯一的例外!))那么,对于在同一个基于异常的函数中抛出和捕获异常的规则的一个例外,就是C++中的java异常,如<代码>最后< /代码>。如果你是清白的,我猜可能会有例外?干杯,
try
{ 
   doLogic()
}
catch (const char *e)
{
    MessageBox(0, e, 0, 0);
    return;
}