Как вы ловите управляемое исключение (из делегата) в неуправляемом C ++? - PullRequest
5 голосов
/ 08 октября 2008

У меня неуправляемый C ++, вызывающий управляемый делегат через указатель функции, предоставленный Marshal :: GetFunctionPointerForDelegate. Этот делегат может создать исключение. Мне нужно уметь правильно обрабатывать это исключение в моем неуправляемом C ++, чтобы обеспечить такие вещи, как очистка указателя и потенциально перевести исключение в более управляемый код. Стек вызовов похож на это:

Управляемый код -> Неуправляемый C ++ -> обратный вызов в Управляемый код через делегат (исключение можно вызвать здесь).

У кого-нибудь есть указатели для правильной обработки этой ситуации, чтобы можно было очистить ресурсы в неуправляемом коде и выдать полезное исключение для управляемого кода, который инициировал весь стек вызовов?

Ответы [ 5 ]

2 голосов
/ 08 октября 2008

Перехват из управляемого кода с

try
{
  throw gcnew InvalidOperationException();
}
catch(InvalidOperationException^ e)
{
  // Process e
  throw;
}

И

[assembly:RuntimeCompatibility(WrapNonExceptionThrows = true)];

в вашей сборке ловит управляемые и неуправляемые исключения

1 голос
/ 10 июня 2011

Даже удаленно не пытайтесь заставить «неуправляемый» код осознавать тот факт, что ему придется иметь дело с .NET.

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

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

0 голосов
/ 15 августа 2015

Мне сказали ... {вектор не может показать, если переменные a & b не были объявлены в процессе области действия. После небольшого копания выяснилось, что дырка в петле была следующей: weibull_distribution> unmanaged_code

0 голосов
/ 10 июня 2011

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

http://msdn.microsoft.com/en-us/library/ms680657(v=VS.85).aspx

0 голосов
/ 08 октября 2008

Один из подходов состоит в том, чтобы использовать SEH и выполнить очистку в фильтре исключений перед продолжением распространения исключения. Но я не уверен, что это чрезмерно законно, так как вы будете выполнять большую работу в фильтре. Вы также ничего не знали бы о распространении управляемого исключения.

Альтернативой является завершение управляемого делегата вашей собственной управляемой функцией, которая перехватывает исключение и, в свою очередь, выдает неуправляемое исключение ... которое вы затем можете перехватить в неуправляемом коде.

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

...