Поделиться через


Различия в обработке ошибок

Основное отличие между структурной обработкой ошибок и обработкой исключений C++, что модель обработки исключений C++ имеет дело в типах, пока c# составило дела модели обработки ошибок с помощью исключения одного типа - в частности, unsigned int.То есть разрешение c# определяются значением целого числа без знака, тогда как исключения C++ определяется типом данных.Если исключение создается в c#, каждый возможный обработчик выполняет фильтр, который определяет контекст исключения c# и проверяет, является ли принять исключение передается в другие обработчику или не обрабатывает его.При возникновении исключения в C++, оно может быть любого типа.

Второе отличие заключается в том, что c# составило модель обработки ошибок называется "асинхронная", поскольку возникновении исключений на сервере-получателе обычного положения элемента управления.Механизм обработки исключений C++ полностью "синхронный", означает, что исключения происходят, только если они созданы.

Если исключение возникает в программе c C++, оно может обрабатываться структурированным обработчиком исключений в связанном с ним фильтром или C++ catch обработчик из динамически близкоее на контекст исключения.Например, следующая программа C++ выдает исключение c в C++ Try контекст:

Пример

// exceptions_Exception_Handling_Differences.cpp
// compile with: /EHa
#include <iostream>

using namespace std;
void SEHFunc( void );

int main() {
   try {
      SEHFunc();
   }
   catch( ... ) {
      cout << "Caught a C exception."<< endl;
   }
}

void SEHFunc() {
   __try {
      int x, y = 0;
      x = 5 / y;
   }
   __finally {
      cout << "In finally." << endl;
   }
}
  
  

Например, следующий код задает пользовательская функция перевода, а затем вызывает исключение c, которое создает программу-оболочкуо SE_Exception класс.

// exceptions_Exception_Handling_Differences3.cpp
// compile with: /EHa
#include <stdio.h>
#include <eh.h>
#include <windows.h>

class SE_Exception {
private:
   SE_Exception() {}
   unsigned int nSE;

public:
   SE_Exception( SE_Exception& e) : nSE(e.nSE) {}
   SE_Exception(unsigned int n) : nSE(n) {}
   ~SE_Exception() {}
   unsigned int getSeNumber() { return nSE; }
};

void SEFunc() {
   __try {
      int x, y = 0;
      x = 5 / y;
    }
    __finally {
      printf_s( "In finally\n" );
   }
}

void trans_func( unsigned int u, _EXCEPTION_POINTERS* pExp ) {
   printf_s( "In trans_func.\n" );
   throw SE_Exception( u );
}

int main() {
   _set_se_translator( trans_func );
    try {
      SEFunc();
    }
    catch( SE_Exception e ) {
      printf_s( "Caught a __try exception with SE_Exception.\n" );
      printf_s( "nSE = 0x%x\n", e.getSeNumber() );
    }
}
  
  
  

Класс-оболочка исключения C#

В простом примере, такими как приведенное выше, исключение c# может быть перехвачено только многоточием () catch обработчик.Никаких сведений о типе или природе исключения не связано с обработчиком.Хотя этот метод работает в некоторых случаях можно задать преобразование между 2 моделями обработки исключений, чтобы каждое исключение c# будет связан с указанным классом.Чтобы сделать это, можно определить класс" a-c "программы-оболочки исключения, которые могут использоваться или класса, производного от атрибута определенный тип исключения ЯЗЫКА c.Это каждое исключение c# может быть обработано C++ catch отдельный обработчик более чем в предыдущем примере.

Ваша класс-оболочка может иметь интерфейс, состоящий из некоторых функций-членов, которые определяют значение исключения, которые получают доступ к расширенные сведения контекста исключения, предоставляемые моделью исключения c#.Можно также определить конструктор по умолчанию, и конструктор, который принимает unsigned int аргумент (предоставлять для основного представления исключения c#) и побитовый оператор, конструктор копий.Следующее возможная реализация класс-оболочки исключения c:

// exceptions_Exception_Handling_Differences2.cpp
// compile with: /c
class SE_Exception {
private:
   SE_Exception() {}
   SE_Exception( SE_Exception& ) {}
   unsigned int nSE;
public:
   SE_Exception( unsigned int n ) : nSE( n ) {}
   ~SE_Exception() {}
   unsigned int getSeNumber() {
      return nSE;
   }
};

Для использования этого класса задается пользовательская функция перевода исключения на языке c#, которая вызывается внутренним исключением. механизма обработки исключений возникает каждый раз.Внутри функции преобразования можно создать любое типизированное исключение (возможно SE_Exception тип или тип, производный от класса SE_Exception), может быть перехвачено соответствующим соответствующий C++ catch обработчик.Функция перевода может просто возвращать, что свидетельствует о том, что она не отрегулировало исключение.Если сама функция перевода, C вызывает исключение. завершение вызывает.

Чтобы определить настраиваемую функцию перевода, вызовите _set_se_translator функция с именем своей функции преобразования в качестве один аргумент.Функция перевода, написании вызывается один раз для каждого вызова функции в стеке, имеющий Try блоки.По умолчанию функция перевода; нет если не указать его путем вызова _set_se_translatorисключение может быть перехвачено многоточием только c# catch обработчик.

См. также

Ссылки

Смешивание (structured C# и исключений C++)