Различия в обработке ошибок
Основное отличие между структурной обработкой ошибок и обработкой исключений 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 обработчик.