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