如果我在不使用例外的情况下执行以下操作会有什么不同吗?
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;
}
}
答案 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意味着系统出现问题,则使用异常。