Шаблон разработки исключения C++

Я хотел бы инкапсулировать ошибки Win32 (возвращенные из GetLastError ()) в некоторой форме класса исключений. Вместо того, чтобы иметь единственное исключение Win32, однако, я хотел бы смочь иметь специализированное исключение, catchable для распространенных ошибок, таких как 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:: Создайте возвраты метода фабрики WindowsException, затем подтип (потенциально ErrorAccessDeniedException) нарезан вниз к базовому типу. Таким образом, экземпляр не может быть полиморфным. Я не хочу использовать new'd указатель, потому что это вынудило бы обработчик исключений удалить его, когда он сделан.

Кто-либо знает о конструктивном решении, которое было бы выполнимо для решения этой проблемы изящно?

Billy3

6
задан Billy ONeal 11 January 2010 в 01:56
поделиться

2 ответа

Единственный верный ответ: это зависит от .

Подготовленные высказывания - прекрасные звери, когда речь заходит о MySQL. Существует большое количество факторов, определяющих кэширование подготовленной инструкции.

Общая идея заключается в том, что если версия < 5,1,17, подготовленная инструкция никогда не кэшируется в кэше запроса, а если используется > = 5,1,17, это зависит от .

См. следующую страницу в руководстве MySQL 5,1:

http://dev.mysql.com/doc/refman/5.1/en/query-cache-operation.html

-121--2404228-

Чтобы использовать область запроса без Spring MVC, необходимо объявить RequestContextListener в web.xml (см. 3,5,4,1. Начальная конфигурация веб-узла ):

<web-app>
  ...
  <listener>
    <listener-class>
        org.springframework.web.context.request.RequestContextListener
    </listener-class>
  </listener>
  ...
</web-app>
-121--1481235-

Изменить

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

на

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

. Это означает, что вместо возврата исключения, а затем его выбрасывания (что приведет к срезу, как вы заметили), ваш помощник/заводской метод выбрасывают его напрямую.

12
ответ дан 8 December 2019 в 17:21
поделиться

поскольку с системного уровня драйверы должны управлять каждым битом каждого байта памяти, другой более высокий язык не может сделать это или не может сделать это, только C/Asm достигают ~

-121--1111705-

Из моего опыта каждый комплекс , в котором функция сгруппирована в скобках (я использую доктрину 1,2,1).

$q->where('name = ?', 'ABC')
  ->andWhere('category1 = ? OR category2 = ? OR category3 = ?', array('X', 'X', 'X'))
  ->andWhere('price < ?', 10)

создает следующий SQL:

WHERE name = 'ABC' 
  AND (category1 = 'X' OR category2 = 'X' OR category3 = 'X')
  AND price < 10
-121--1223143-

Еще одно исключение, обрабатывающее фоновое чтение: http://www.informit.com/articles/article.aspx?p=373339

Примечание о разделении и повторном преобразовании типов:

При повторном преобразовании исключения e, предпочитает писать просто бросать; вместо этого броска е; потому что первая форма всегда сохраняет полиморфизм перекроенный объект.

2
ответ дан 8 December 2019 в 17:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: