Ответ на ваше первое требование должен иметь (в самом основном):
try
{
// Main application
}
catch // Though you might not want this
{
}
finally
{
// This code always executed even if application crashes.
}
Однако при работе с приложениями Windows существуют и другие соображения, которые RichardOD указывает в своих комментариях здесь - http://msdn.microsoft.com/en-us/library/system.appdomain.unhandledexception.aspx и здесь http://msdn.microsoft.com/en-us/library/system.windows.forms.application.threadexception.aspx
Ответом на ваше второе требование является то, что вы не можете перехватить остановку приложения в отладчике (или, по крайней мере, я не сталкивался с этим). Это просто убивает процесс.
Например, если вы остановились в точке останова, а затем нажали «Стоп», код не переходит к завершению - он просто завершается.
То же самое верно, если приложение останавливается из-за какого-либо внешнего фактора, например, при отключении питания. В подобных сценариях программа не может выполнить любой код, независимо от того, находится он в блоке finally или нет!
Тем не менее, я только что натолкнулся на этот вопрос Visual Studio: выполнение кода очистки при остановке отладки , ответ на который гласит:
Вы можете использовать DTE (VisualStudio
Модель автоматизации) написать макрос
это будет вызвано при остановке отладки
случается, ниже приведен фрагмент
идея.
Private Sub DebuggerEvents_OnEnterDesignMode(ByVal Reason As EnvDTE.dbgEventReason, ByRef ExecutionAction As EnvDTE.dbgExecutionAction) Handles DebuggerEvents.OnEnterDesignMode
If (Reason = dbgEventReason.dbgEventReasonStopDebugging) Then
// DO YOUR CLEAN UP CODE HERE
End If
End Sub
Так что, хотя вы не можете перехватить остановку выполнения в своем приложении, вы можете что-то с этим сделать в Visual Studio.
ПРИМЕЧАНИЕ: Ответ предоставлен Shay Erlichmen not me!