什么:抛出0 /意味着什么?这是“坏”吗?

时间:2010-04-13 10:14:01

标签: c++ exception

上下文

我遇到了一些代码,如下:

if( Some_Condition ) throw 0;

我google了一下,发现了一些其他代码片段,使用了奇怪的throw 0形式。

我认为有人会将其视为:

catch(const int& e) 
{  }

或者这是一个NULL ptr?被抓到void*

问题

throw 0做了什么?它在某种程度上是特殊的吗?

我的正常偏好是抛出(或衍生自)std::exception的东西。所以对我来说这看起来很糟糕。 它“不好”吗?

3 个答案:

答案 0 :(得分:15)

一般来说,throw可以抛出任何类型,只需要使用此类型或其基类型来捕获它。

从技术上讲,它是合法代码但是......

这是错误的代码:您应始终从std::exception或至少从某些类派生您的异常,这些类提供有关错误的有用信息,而不是普通数字。但是从std::exception派生的是 正确的方法,因为它允许使用最顶层的catch(std::exception const &e)并至少获得有关错误的一些信息。

答案 1 :(得分:4)

这不是特别的,你可以将int作为异常类。

它被认为是一种糟糕的风格,因为异常类可以更多地讲述实际发生的事情。

答案 2 :(得分:2)

这是一个int。 它是“坏”,因为抛0会使代码不可读,或暗示某人正在使用异常作为值返回系统。 (这与代码中的幻数基本相同)

NULL定义为((void *)0)。如果编译器看到0则表示int。它可能会自动转换为其他内容,但只有在有原因的情况下(例如,赋值为double)。行throw 0没有给出这样的理由,因此抛出了一个int。