Как создать C++ обертка Dll, которая ловит все исключения?

В SQL Server 2005+ вы можете использовать функции Window. Но он не поддерживается в MySQL.

В подзапросе, выбор операторов должен иметь оператор объединения. Например:

SELECT * FROM (
    (SELECT COUNT(..) ...) AS C1
       INNER JOIN (SELECT COUNT(...) ...) AS C2
            ON <condition>
       INNER JOIN ... )
14
задан Unimportant 12 February 2009 в 13:52
поделиться

8 ответов

Единственный способ сделать горное тело, обертка DLL должна загрузить ошибочный DLL в другом процессе, так, чтобы, если это разрушает его, не удалял Ваш первичный процесс с ним.

Ловля всех исключений C++ кажется разумной, но ловящий все структурированные исключения другая история. SEH мог бы казаться для получения Вас большая часть пути там, потому что он позволяет Вам ловить нарушения прав доступа, делить на нуль исключения, и т.д.

, Но что, если ошибочный DLL, оказывается, касается незафиксированной страницы от стопки другого потока? Доступ к памяти разобьет на страницы отказ, обработчик исключений будет вызван, и теперь, когда страница больше не является защитной страницей. Когда тот поток должен будет вырастить стек, это получит нарушение прав доступа, и процесс откажет. ( Эти сообщения описывают этот случай более подробно.)

Другая вероятная проблема: ошибочный DLL отказывает при содержании объекта синхронизации, но Вы используете SEH для ловли исключения. Если Ваш процесс пытается получить тот же объект синхронизации, то он заходит в тупик вместо катастрофического отказа. Общий объект синхронизации может быть частью времени выполнения C или ОС: что, если ошибочный DLL 1 загружает ошибочный DLL 2, который отказывает в DllMain(), в то время как ошибочный DLL 1 содержит блокировку загрузчика? Ваш процесс зайдет в тупик в следующий раз, когда он загружает DLL?

, Для получения дополнительной информации о почему это (и функции как IsBadReadPtr(), которые имеют подобные проблемы) является неправильным употреблением SEH:

24
ответ дан 1 December 2019 в 06:21
поделиться

В Windows C++ имеет 2 различных стиля исключений: C++ и исключения SEH.

SEH является окнами только форма исключений ( несколько сродни сигналам в UNIX). Это - больше системного исключения уровня. Они будут брошены для таких операций как доступы недопустимого указателя, проблемы выравнивания, и т.д.

, Если Вы захотите поймать каждое исключение, которое может быть выдано приложением C++ на окнах, необходимо будет поймать обоих. К счастью, существует способ смешать использование исключения SEH и C++. Я записал подробное сообщение в блоге об этом недавно, оно должно выручить Вас.

http://blogs.msdn.com/jaredpar/archive/2008/01/11/mixing-seh-and-c-exceptions.aspx

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

Постепенное увеличение итератора по стандарту libary контейнер никогда не будет бросать исключение C++. Это может дать Вам неопределенное поведение.

4
ответ дан 1 December 2019 в 06:21
поделиться

Код ниже взят от Zeus IDE. Это захватит любые исключительные ситуации Windows:

Шаг № 1: Определяют Функцию Фильтра Исключения

  DWORD ExceptionFilter(EXCEPTION_POINTERS *pointers, DWORD dwException)
  {
    //-- we handle all exceptions
    DWORD dwResult = EXCEPTION_EXECUTE_HANDLER;

    switch (dwException)
    {
      case EXCEPTION_ACCESS_VIOLATION:
      case EXCEPTION_DATATYPE_MISALIGNMENT:
      case EXCEPTION_ARRAY_BOUNDS_EXCEEDED:
      case EXCEPTION_FLT_DENORMAL_OPERAND:
      case EXCEPTION_FLT_DIVIDE_BY_ZERO:
      case EXCEPTION_FLT_INEXACT_RESULT:
      case EXCEPTION_FLT_INVALID_OPERATION:
      case EXCEPTION_FLT_OVERFLOW:
      case EXCEPTION_FLT_STACK_CHECK:
      case EXCEPTION_FLT_UNDERFLOW:
      case EXCEPTION_INT_DIVIDE_BY_ZERO:
      case EXCEPTION_INT_OVERFLOW:
      case EXCEPTION_PRIV_INSTRUCTION:
      case EXCEPTION_NONCONTINUABLE_EXCEPTION:
      case EXCEPTION_BREAKPOINT:
        dwResult = EXCEPTION_EXECUTE_HANDLER;
        break;
    }

    return dwResult;
  }

Шаг № 2: Переносят код в __ попытка и __ кроме как показано ниже:

  __try
  {
    // call your dll entry point here
  }
  __except(ExceptionFilter(GetExceptionInformation(), 
                           GetExceptionCode()))
  {
    //-- display the fatal error message
    MessageBox(0, "An unexpected error was caught here!", 
               "Unexpected Error", MB_OK);
  }
4
ответ дан 1 December 2019 в 06:21
поделиться

Этот код содержит логическую ошибку, если вообще. Начиная с логической ошибки constitues ошибка, не глотайте исключение †“В , фиксируют ошибку !

, Конечно, это характерно для конкретного кода. Другие дали больше общие рекомендации. Однако я нашел, что много людей на самом деле делает , предпочитают ловить исключения по фиксации логических ошибок, и это просто недопустимо.

3
ответ дан 1 December 2019 в 06:21
поделиться

Вы посмотрели на API-функцию окон SetUnhandledExceptionFilter?

я обычно называю его в функции DllMain и имею его, генерируют мини-дамп, когда DLL отказывает. Однако: (a) я не знаю, захватывает ли это исключения приложения, а также исключения DLL и (b) я не знаю, может ли у Вас быть возврат обработчика таким способом, которым может продолжиться выполнение программы. В документах говорится да, но я никогда не делал этого.

2
ответ дан 1 December 2019 в 06:21
поделиться

Что Вы собираетесь сделать после ловли исключения (специально для исключений SEH)?

В действительности Вы не можете сделать предположения о состоянии процесса, реалистично единственная опция, которую Вы имеете, состоит в том, чтобы (дополнительно) вывести ядро и выход.

Любая попытка и продолжение абсолютно собираются вызвать Вас проблемы в конечном счете.

1
ответ дан 1 December 2019 в 06:21
поделиться

Конрад Рудольф: Конечно, этот код содержит "логическую ошибку", это для иллюстрации проблемы, которая может возникнуть. Как говорит человек, он хочет иметь возможность защитить свою dll от любых возможных ошибок. Вы не думаете, что это законный вопрос? Слышал о продуктах производителей. Некоторые из нас живут в реальном мире и живут с реальными проблемами. Просто невозможно исправить проблемы всех остальных

3
ответ дан 1 December 2019 в 06:21
поделиться
Другие вопросы по тегам:

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