Unicode exception class

Unicode exception class

本文关键字:class exception Unicode      更新时间:2023-10-16

我想用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;  
    } 
};

这工作得很好,但我有一些问题:

  1. 为什么我需要从std::exception类派生?也许根本不需要这个?
  2. 我错过了什么在我的类实现?
  1. 你不需要继承std::exception。直接或间接继承它的优点是允许接口的用户通过引用std::exception来捕获异常,而不依赖于异常类型的定义。

    当然,通过std::exception访问uwhat是不可能的,所以如果你不打算实现我的建议,那么不继承std::exception甚至可能是你设计的理想。

  2. 如果你决定继承,那么减少what的可见性是不可能的。<一口>

    你的what实现违反了std::exception的接口,没有返回指向空结束字符串的指针。如果异常处理程序通过引用std::exception捕获了该异常,调用what()并解引用该指针,将会出现混乱。

    实现what的一种简单方法是改为return ""。然而……<一口> __

我建议考虑另一种选择:与其返回"nothing",不如将存储的宽字符串的编码转换为本地的窄字符串编码,并返回指向该字符串的指针。当然,这将是更多的工作来实现,但也将使您的异常更方便。

††从技术上讲,您可以降低uexception::what的可见性,正如您所做的那样,但它不会影响uexception::exception::what的可见性。此外,这样做违反了Liskov替换原则。我建议您要么继承std::exception并公开正确地实现what,要么根本不继承std::exception