gpt4 book ai didi

c++ - Unicode 异常类

转载 作者:行者123 更新时间:2023-11-30 01:43:10 26 4
gpt4 key购买 nike

我想实现带有 unicode 异常的仅 header 类,我从以下代码开始:

#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. 我是否遗漏了类(class)实现中的某些内容?

最佳答案

  1. 您不必继承std::exception。直接或间接继承它的优点是允许您的接口(interface)的用户通过引用 std::exception 捕获您的异常 - 而无需依赖于您的异常类型的定义。

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

  2. 如果您决定继承,那么降低what 的可见性是不可能的。 ††

    您的what 实现违反了std::exception 的接口(interface),因为它没有返回指向空终止字符串的指针。如果异常处理程序通过引用 std::exception 捕获它,调用 what() 并取消引用指针,困惑就会接踵而至。

    实现 what 的简单方法是 return ""。然而……

我建议考虑一个替代方案:您可以将存储的宽字符串的编码转换为 native 窄字符串编码并返回指向它的指针,而不是返回“无”。当然,这将需要更多的工作来实现,但也会使您的异常更加方便。

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

关于c++ - Unicode 异常类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38186579/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com