Как поймать исключение c0000005 из родной dll в С#

Я работаю с собственной dll, которая где-то выдает исключение c0000005 (нарушение доступа) и в конечном итоге приводит к сбою моей веб-службы, пока служба не будет переработана. Есть ли способ поймать исключение?


person Marty Trenouth    schedule 11.08.2011    source источник


Ответы (3)


Я согласен с остальными... Исправьте проблему, но иногда вы наследуете код, и вы просто хотите поймать неожиданное нарушение в производстве.

В .net 4+ вы можете добавить атрибут HandleProcessCorruptedStateExceptions, и он выйдет как исключение, которое вы можете поймать. Стек вызовов не очень полезен, но это лучше, чем ничего.

C#

[System.Runtime.ExceptionServices.HandleProcessCorruptedStateExceptions]
public void SomeCSharpMethod()
try
{
  // call managed code
}
catch (Exception ex)
{
  Console.WriteLine("Exception");
}

C++

vector<int> myValues;
int a = myValues[1];
person Jerry    schedule 13.07.2012
comment
Я согласен с обеими сторонами: (1) решить реальную проблему; (2) поймать исключение, чтобы лучше понять, в чем заключается настоящая проблема. Я рекомендую вам повторно выбросить исключение, чтобы не забыть о нем. Цель его поймать — понять, а не игнорировать. - person Jesse Chisholm; 29.10.2013
comment
@ Джерри, ты только что сделал мой день, мне нужно было получить значок системы под окном wpf, открытым консольным приложением; в старой ОС, которая может только вылетать (даже без указания значения 0 в качестве результата), в новой ОС работает нормально. Теперь, когда я могу поймать исключение, все работает нормально, спасибо! :) - person HypeZ; 10.02.2014

вы можете перехватить исключение, используя Microsoft обработчик исключений SEH, но на самом деле вы должны исправить все, что не так.

Ура и чт.,

person Cheers and hth. - Alf    schedule 11.08.2011
comment
Хотел бы я это исправить, но это в сторонней dll. - person Marty Trenouth; 11.08.2011
comment
@Marty: только потому, что ошибка обнаружена в сторонней DLL, не означает, что ошибка происходит именно там. Проверьте все входные данные и внимательно прочитайте документацию. Возможно, вы передаете ему неверные входные данные! - person André Caron; 11.08.2011
comment
Я не согласен со всеми, кто говорит, что нет смысла перехватывать такое исключение C++ в приложении C#. Если бы можно было поймать исключение, распечатать некоторую отладочную информацию и повторно сгенерировать исключение, то можно было бы лучше узнать, какой вызов DLL имеет неправильные аргументы. - person Jesse Chisholm; 29.10.2013

Не лови это. Исправьте ошибку.

0xc0000005 — это код ошибки NT для STATUS_ACCESS_VIOLATION. Это означает, что ваша программа неправильно разыменовала указатель. Проще говоря, это означает, что ваша программа сильно потерпела крах, и попытка восстановления была ошибочной.

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

person asveikau    schedule 11.08.2011
comment
Вы можете подумать, что первым шагом к решению проблемы является ее обнаружение, чтобы вы могли более подробно изучить неисправность. - person LordWilmore; 18.02.2016