相关疑难解决方法(0)

Unicode的异常what()

或者,"俄罗斯人如何抛出异常?"

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();
  };
}
Run Code Online (Sandbox Code Playgroud)

一个思想的流行学设计异常层次结构是从的std ::例外得出:

通常,最好抛出对象,而不是内置函数.如果可能,您应该抛出从(最终)从std :: exception类派生的类的实例.通过使您的异常类从标准异常基类继承(最终),您可以让您的用户更轻松(他们可以选择通过std :: exception捕获大部分内容),而且您可能正在为他们提供更多信息(例如,您的特定异常可能是std :: runtime_error或其他任何内容的改进).std :: runtime_error或其他).

但是面对Unicode,似乎不可能设计一个能够实现以下两个目的的异常层次结构:

  • 最终从std :: exception派生,以便在catch站点使用
  • 提供Unicode兼容性,以便诊断不会被切片或乱码

使用可以使用Unicode字符串构造的异常类非常简单.但标准规定what()必须返回一个const char*,因此在某些时候输入字符串必须转换为ASCII.无论是在构造时完成还是调用what()(如果源字符串使用的字符不能用7位ASCII表示),可能无法在不丢失保真度的情况下格式化消息.

如何设计一个异常层次结构,它结合了std :: exception派生类与无损Unicode诊断的无缝集成?

c++ c++11

56
推荐指数
2
解决办法
1万
查看次数

标签 统计

c++ ×1

c++11 ×1