我遇到了一些代码,如下:
if( Some_Condition ) throw 0;
我google了一下,发现了一些其他代码片段,使用了奇怪的throw 0
形式。
我认为有人会将其视为:
catch(const int& e)
{ }
或者这是一个NULL ptr?被抓到void*
?
这throw 0
做了什么?它在某种程度上是特殊的吗?
我的正常偏好是抛出(或衍生自)std::exception
的东西。所以对我来说这看起来很糟糕。
它“不好”吗?
答案 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。