【发布时间】:2011-04-15 05:08:56
【问题描述】:
或者,“俄罗斯人如何抛出异常?”
std::exception的定义是:
namespace std {
class exception {
public:
exception() throw();
exception(const exception&) throw();
exception& operator=(const exception&) throw();
virtual ~exception() throw();
virtual const char* what() const throw();
};
}
用于设计异常层次结构的popular school of thought 是从 std::exception 派生的:
一般来说,最好扔东西, 不是内置插件。如果可能的话,你应该 抛出派生类的实例 (最终)来自 std::exception 班级。通过使您的异常类 (最终)从标准继承 异常基类,您正在制作 让您的用户生活更轻松(他们有 捕捉大多数东西的选项 std::exception),另外你可能是 为他们提供更多信息 (例如,您的特定 例外可能是对 std::runtime_error 或其他)。
但是面对Unicode,设计一个同时实现以下两个的异常层次结构似乎是不可能的:
- 最终从 std::exception 派生,以便在捕获站点使用
- 提供 Unicode 兼容性,因此诊断不会被分割或乱码
想出一个可以用 Unicode 字符串构造的异常类很简单。但是标准规定 what() 必须返回一个 const char*,因此在某些时候必须将输入字符串转换为 ASCII。无论是在构建时完成还是在调用 what() 时完成(如果源字符串使用 7 位 ASCII 无法表示的字符),可能无法在不丢失保真度的情况下格式化消息。
您如何设计一个异常层次结构,将 std::exception 派生类的无缝集成与无损 Unicode 诊断相结合?
【问题讨论】:
-
没什么大不了的,只是使用使用字节的编码。 IMO
std:.exception的更大问题是派生类非虚拟派生自它。因此,您无法从您自己的基类派生,派生自std::exception,例如std::out_of_range。 -
@sbi: 是的,但我通过仅直接根据
std::exception定义我的层次结构来避开这个问题。我抛出我自己的std::exception派生异常并将其他标准定义的异常留给标准库。可以肯定的是,这不是一个理想的解决方案,但对于我的使用来说,考虑到标准的当前状态,它是最好的解决方案。 -
刚刚注意到:似乎与以下内容重复:stackoverflow.com/questions/618111/…
-
在苏维埃俄罗斯,你会遇到异常。