2008-10-29 8 views
1

Есть ли .net, эквивалентный функции C++ неожиданным()/set_unexpected()?.Net Эквивалент set_unexpected()


Edit: К сожалению - я опустил некоторые детали ранее:

Язык: C# 2.0

У меня есть несколько старых приложений, которые, кажется, бросает некоторые необработанное исключение где-то. Я просто хочу положить что-то на место, чтобы остановить боль клиента, пока я не смогу проследить фактический источник проблемы. В C++ функция, на которую указывает set_unexpected(), вызывается, насколько мне известно, когда необработанное исключение пузырится к основной подпрограмме. Отсюда мой вопрос об эквивалентной функции .net.

+0

Не могли бы вы дать более подробную информацию о том, какой эффект вы пытаетесь достичь в целом? Скорее всего, идиоматический способ в .NET не будет точно отражать неожиданные/set_unexpected. – 2008-10-29 14:07:57

+0

Да, Джон, я вижу, что вы говорите. Я понял, что после того, как я разместил свой вопрос, я подробно рассказал об этом. Я отредактирую соответствующим образом. – 2008-10-29 14:20:28

ответ

2

Там 3 возможные сценарии для обработки необработанных исключений, в зависимости от типа приложения:

  1. для приложения Windows Forms, крючок обработчика событий Application.ThreadException
  2. Для командной строки приложений, крючок обработчика событий AppDomain.UnhandledException
  3. Для приложений ASP.NET в Global.asax, создать:

    защищен недействительным Application_Error (отправитель объекта, EventArgs е)

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Я не разработчик C++, но из того, что я прочитал, это должно ответить на ваш вопрос.

0

Эти обработчики должны улавливать самые неожиданные исключения в смешанном режиме.

private delegate long UnhandledExceptionFilter(IntPtr exception); 

[DllImport("KERNEL32.DLL", SetLastError = true)] 
private static extern IntPtr SetUnhandledExceptionFilter([MarshalAs(UnmanagedType.FunctionPtr)] UnhandledExceptionFilter filter); 

// put these in your bootstrapper 
AppDomain.CurrentDomain.UnhandledException += CurrentDomainUnhandledException; 
Application.ThreadException += ApplicationThreadException; 
SetUnhandledExceptionFilter(UnhandledExceptionFilter); 

void CurrentDomainUnhandledException(object sender, UnhandledExceptionEventArgs e) 
{ 
    ... 
} 

void ApplicationThreadException(object sender, ThreadExceptionEventArgs e) 
{ 
    ... 
} 

long UnhandledExceptionFilter(IntPtr exception) 
{ 
    .... 
}