Unicode exception class
Unicode exception class
我想用unicode异常实现仅标头类,我已经开始使用以下代码:
#pragma once
#include <string>
#include <exception>
using namespace std;
class uexception : public exception
{
public:
explicit uexception(const wchar_t* msg)
{
this->msg = msg;
}
explicit uexception(const wstring& msg)
{
this->msg = msg;
}
const wchar_t* uwhat() const throw ()
{
return msg.c_str();
}
private:
wstring msg;
const char* what() const throw () //hidden
{
return NULL;
}
};
这工作得很好,但我有一些问题:
- 为什么我需要从std::exception类派生?也许根本不需要这个?
- 我错过了什么在我的类实现?
-
你不需要继承
std::exception
。直接或间接继承它的优点是允许接口的用户通过引用std::exception
来捕获异常,而不依赖于异常类型的定义。当然,通过
std::exception
访问uwhat
是不可能的,所以如果你不打算实现我的建议†,那么不继承std::exception
甚至可能是你设计的理想。 -
如果你决定继承,那么减少
what
的可见性是不可能的。<一口>一口>你的
what
实现违反了std::exception
的接口,没有返回指向空结束字符串的指针。如果异常处理程序通过引用std::exception
捕获了该异常,调用what()
并解引用该指针,将会出现混乱。实现
what
的一种简单方法是改为return ""
。然而……<一口> __ 一口>
†我建议考虑另一种选择:与其返回"nothing",不如将存储的宽字符串的编码转换为本地的窄字符串编码,并返回指向该字符串的指针。当然,这将是更多的工作来实现,但也将使您的异常更方便。
††从技术上讲,您可以降低uexception::what
的可见性,正如您所做的那样,但它不会影响uexception::exception::what
的可见性。此外,这样做违反了Liskov替换原则。我建议您要么继承std::exception
并公开正确地实现what
,要么根本不继承std::exception
。
相关文章:
- 这个语法std::class<>{}(arg1, arg2) 在C++中是什么意思?
- C++核心准则 C35 对于接口类"A base class destructor should be either public and virtual, or protected and nonv
- 使用模板进行堆栈实现; "name followed by :: must be a class or namespace"
- "Undefined class"作为is_base_of的论据
- 如何将class.cpp和class.hpp编译为一个.o文件
- 为重写std::exception的库生成swig接口时出错
- 什么是 std::exception::what() 以及为什么要使用它?
- 链表"exception thrown"
- '{'标记之前的预期类名,然后在预声明时无效使用不完整的类型'class class_name'
- 如何使用"derived input class"创建派生类?
- 为什么程序员同时使用 std::bad_alloc 和 std::exception.是否 std::例外 仅是不够的
- 错误:"Left of getValue must have class/struct/union"
- ' class a : b ' 和 ' class a : public b ' 之间的继承类不同
- Pybind11 Class Definition
- 在C++中使用没有合作伙伴Class/Cpp文件的头文件是否实用
- C2011 'CMemDC':Visual Studio 2019中的'class'类型重新定义
- TypeError: [c++ addon class] 不是构造函数
- C++ class template
- 尝试打印字符串时"Python Exception <class 'gdb.error'> There is no member named _M_dataplus."
- Unicode exception class