Ответ 1
Что и почему это происходит
Результат зависит от того, какую кнопку вы нажимаете при сбое программы. Если вы не уверены, в диалоговом окне "Отчет об ошибках Windows" отобразятся "Отладка" и "Закрыть программу". Если вы нажмете кнопку "Закрыть программу", программа будет остановлена системой operationg без каких-либо шансов написать что-то еще для консоли.
Если вы достаточно быстро нажмете кнопку "Отмена", то часть отчета об ошибках Windows будет отменена, и управление вернется к вашей программе. Затем он напишет "Морковь" на консоль.
Следовательно, это не проблема .NET, но вопрос о том, как Windows реагирует на диспетчеризацию исключений.
Как получить контроль над ним
Чтобы отключить диалог WER, вы можете использовать WerAddExcludedApplication. Чтобы избавиться от диалога Debug, вы можете использовать SetErrorMode.
Пожалуйста, ознакомьтесь с недостатками использования этих методов. Прочитайте Раймонд Чэнь комментирует WerAddExcludedApplication и проверяет может ли SetThreadErrorMode.
Затем ваш код может выглядеть следующим образом:
using System;
using System.Runtime.InteropServices;
namespace ExceptionInCatch
{
class Program
{
[DllImport("wer.dll", SetLastError = true, CharSet = CharSet.Unicode)]
static extern int WerAddExcludedApplication(String pwzExeName, bool bAllUsers);
[Flags]
public enum ErrorModes : uint
{
SYSTEM_DEFAULT = 0x0,
SEM_FAILCRITICALERRORS = 0x0001,
SEM_NOALIGNMENTFAULTEXCEPT = 0x0004,
SEM_NOGPFAULTERRORBOX = 0x0002,
SEM_NOOPENFILEERRORBOX = 0x8000,
SEM_NONE = SEM_FAILCRITICALERRORS | SEM_NOALIGNMENTFAULTEXCEPT | SEM_NOGPFAULTERRORBOX | SEM_NOOPENFILEERRORBOX
}
[DllImport("kernel32.dll")]
static extern ErrorModes SetErrorMode(ErrorModes uMode);
public static void Main(string[] args)
{
var executableName = AppDomain.CurrentDomain.FriendlyName;
WerAddExcludedApplication(executableName, false);
SetErrorMode(ErrorModes.SEM_NONE);
try
{
throw new Exception("Apple");
}
catch (Exception ex)
{
throw new Exception("Banana");
}
finally
{
// This line will now execute
Console.WriteLine("Carrot");
}
}
}
}