2009-12-07 65 views
2

我试图抓住被零除的尝试:如何捕获此错误? [C++]

int _tmain(int argc, _TCHAR* argv[]) 
{ 
int a = 5; 
try 
{ 
int b = a/0; 
} 
catch(const exception& e) 
{ 
    cerr << e.what(); 
} 
catch(...) 
{ 
    cerr << "Unknown error."; 
} 
    cin.get(); 
return 0; 
} 

,基本上这是行不通的。任何建议为什么? 谢谢。 P.S. 在将来的代码可以放在[code] [/ code]标签而不是四个空格之间的任何机会?

+0

重新您的PS:Markdown不是BBCode或任何用途[code]。您可以将您的代码粘贴到编辑器中,突出显示它,然后按Ctrl + K自动缩进。 – 2009-12-07 10:02:40

回答

7

除以零不会引发标准C++中的任何异常,而是会给您提供未定义的行为。通常情况下,如果你想提高一个例外,你需要自己做:

int divide(int a, int b) { 
    if (b == 0) { 
     throw DivideByZero; // or whatever 
    } 
    return a/b; 
} 
+0

谢谢你们。 P.S.评论必须至少有15个字符长吗? – 2009-12-07 10:01:37

+0

显然伪防垃圾邮件... – 2009-12-07 13:00:35

+0

个人而言,我会制作一个模板,并将其称为checked_divide。 – 2009-12-07 13:00:55

2

最好的方法是检查除数等于0

C++不检查除以零。简要的讨论可以在here找到。

+0

有趣的是,atch报告,他没有抛出异常,这与您的链接不同步...嗯 – jpinto3912 2009-12-07 10:41:05

+1

讨论说硬件*可能会抛出异常,而不是它肯定会抛出异常。该方法展示了如何测试这个。 – larsmoa 2009-12-07 11:01:23

2

您似乎正在为Windows编写代码(证据:_tmain_TCHAR不是可移植的C++)。

如果你想一个解决方案仅适用于Windows,那么你可以使用所谓的“结构化异常处理”(SEH):

然而,这是一个MS-只featu回覆。如果您依赖抛出的异常来处理这个错误,那么如果您希望它在其他平台上工作,则需要付出相当大的努力才能更改您的代码。

最好在编写代码时意识到除数可能为0的时候(就像当你做数学,除以数量一样,你必须考虑它是否为0)。尼尔的方法是一个很好的低影响解决方案:只要你不确定,你可以使用他的divide函数。