首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++异常设计模式

C++异常设计模式
EN

Stack Overflow用户
提问于 2010-01-11 09:56:34
回答 2查看 2.3K关注 0票数 6

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

例如,我会像这样声明类:

代码语言:javascript
复制
class WindowsException : public std::exception
{
public:
    static WindowsException Create(DWORD lastError);
    //blah

};

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

但是,我希望Win32异常负责选择要返回的正确异常。也就是说,异常的抛出程序应该如下所示:

代码语言:javascript
复制
int DangerousMethod() {
    throw WindowsAPI::WindowsException::Create(GetLastError());
}

捕手可能看起来像这样:

代码语言:javascript
复制
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)就会被分割成基类型。也就是说,实例不能是多态的。我不想使用new'd指针,因为这会迫使异常处理程序在完成时将其删除。

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

Billy3

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-01-11 10:06:52

变化

代码语言:javascript
复制
int DangerousMethod() {
    throw WindowsAPI::WindowsException::Create(GetLastError());
}

代码语言:javascript
复制
int DangerousMethod() {
    WindowsAPI::WindowsException::Throw(GetLastError());
}

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

票数 12
EN

Stack Overflow用户

发布于 2010-01-11 10:18:44

更多异常处理背景阅读:http://www.informit.com/articles/article.aspx?p=373339

关于类型切片和重新抛出的说明:

当重新抛出异常e时,更喜欢写为只抛出;而不是抛出e;,因为第一种形式总是保留被重新抛出的对象的多态性。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2039529

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档