gpt4 book ai didi

C++ 异常设计模式

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:10:32 24 4
gpt4 key购买 nike

我想将 Win32 错误(从 GetLastError() 返回的错误)封装在某种形式的异常类中。但是,我不希望有一个 Win32 异常,而是希望能够有一个可捕获常见错误的专门异常,例如 ERROR_ACCESS_DENIED。

例如,我会这样声明类:

class WindowsException : public std::exception
{
public:
static WindowsException Create(DWORD lastError);
//blah

};

class ErrorAccessDeniedException : public WindowsException
{
public:
//blah
};

但是,我希望 Win32 异常负责选择正确的异常返回。也就是说,异常的抛出者应该是这样的:

int DangerousMethod() {
throw WindowsAPI::WindowsException::Create(GetLastError());
}

捕手可能看起来像:

try
{
DangerousMethod();
} catch(WindowsAPI::ErrorAccessDeniedException ex)
{
//Code for handling ERROR_ACCESS_DENIED
} catch(WindowsAPI::WindowsException ex)
{
//Code for handling other kinds of error cases.
}

我的问题是,如果 WindowsException::Create 工厂方法返回一个 WindowsException,那么子类型(可能是 ErrorAccessDeniedException)被分割成基本类型。也就是说,实例不能是多态的。我不想使用新的指针,因为这会强制异常处理程序在完成后将其删除。

有谁知道可以优雅地解决这个问题的设计解决方案吗?

比利3

最佳答案

改变

int DangerousMethod() {
throw WindowsAPI::WindowsException::Create(GetLastError());
}

int DangerousMethod() {
WindowsAPI::WindowsException::Throw(GetLastError());
}

意思是,不是返回异常然后抛出它(正如您观察到的那样,它将切片),而是让您的帮助器/工厂方法直接抛出它。

关于C++ 异常设计模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2039529/

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