对于许多问题,答案似乎可以在"标准"中找到.但是,我们在哪里找到它?最好是在线.
谷歌搜索有时会觉得徒劳,尤其是对于C标准,因为他们在编程论坛的大量讨论中被淹没.
要开始这个,因为这些是我现在正在搜索的,那里有很好的在线资源:
我刚刚创建了异常层次结构,并希望传递char*给我的一个派生类的构造函数,并带有一条告诉错误的消息,但显然std::exception没有允许我这样做的构造函数.然而,有一个类成员被称为what()可以传递一些信息.
我怎么能(我可以?)将文本传递给a的派生类,std::exception以便通过我的异常类传递信息,所以我可以在代码中的某处说:
throw My_Exception("Something bad happened.");
Run Code Online (Sandbox Code Playgroud) 我刚才注意到的事情.定义exception的标准(18.6.1):
class exception {
public :
exception() throw();
exception(const exception &) throw();
exception& operator=(const exception&) throw();
virtual ~exception() throw();
virtual const char* what() const throw();
};
Run Code Online (Sandbox Code Playgroud)
exception在MSDN中的定义:
class exception {
public:
exception();
exception(const char *const&);
exception(const char *const&, int);
exception(const exception&);
exception& operator=(const exception&);
virtual ~exception();
virtual const char *what() const;
};
Run Code Online (Sandbox Code Playgroud)
看起来Microsoft的版本允许您为exception对象指定错误消息,而标准版本只允许您为派生类执行此操作(但不会阻止您exception使用未定义的消息创建泛型).
我知道这是非常微不足道的,但仍然存在.有这么好的理由吗?
我有以下C++代码
template <class E>
class ExceptionWrapper {
public:
explicit ExceptionWrapper(const E& e): e(e) {}
void throwException() {
throw e;
}
private:
E e;
};
...
try {
ExceptionWrapper<E> w(...);
w.throwException();
} catch (const E& e) {
...
}
...
Run Code Online (Sandbox Code Playgroud)
问题:这段代码有效吗?我可以争辩说,返回对类成员的引用几乎总是无效的(我相信每个人都同意这个陈述).但是,我的同事声称事实并非如此throw.
改变后的PS catch (const E& e)到catch (E e)一个讨厌的错误看似消失这加强了我的位置-这个代码是不是有效.