Необработанные исключения в бесконечном цикле

У меня есть проблема, которую я не могу решить для проекта. Рассмотрим этот код:

namespace TestApp
{
class Program
{
    static void Main(string[] args)
    {
        AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(UnhandledExceptionsHandler);

        int[] a = { 0, 1, 2 };
        int y = a[6];
    }

    public static void UnhandledExceptionsHandler(object sender, UnhandledExceptionEventArgs e)
    {
        try
        {
            File.AppendAllText("Exceptions.log", (e.ExceptionObject as Exception).Message);
        }
        catch (Exception ex)
        {
            Environment.Exit(1);
        }
    }
}
}

Обработчик необработанного исключения фактически захватывает необработанное исключение по желанию и записывает сообщение в файл журнала. Но при выходе из обработчика код возобновляется со строкой index out of range: int y = a[6]. Мне нужен код либо для перехода к следующей строке кода, либо для продолжения работы с необработанным исключением в обычном режиме - в данном случае для завершения работы приложения. Как бы то ни было, я застрял в бесконечном цикле генерирования необработанного исключения/нажатия на обработчик события необработанного исключения.


person Dan Hass    schedule 12.12.2013    source источник
comment
try/finally вместо try/catch?   -  person Jon    schedule 13.12.2013


Ответы (1)


Вы хотите try..finally в своем обработчике:

try {
    File.AppendAllText("Exceptions.log", (e.ExceptionObject as Exception).Message);
}
finally {
    Environment.Exit(1);
}

То, что у вас есть сейчас, это только отлов ошибки, возникающей при записи файла журнала. Если нет ошибки (которой нет).. он завершит метод и вернется к исходному исключению.

person Simon Whitehead    schedule 12.12.2013
comment
Но я не хочу, чтобы выполнение прерывалось обработчиком. Я хочу, чтобы выполнение возобновилось в исходном коде. - person Dan Hass; 13.12.2013
comment
Вы не можете. По сути, вы не можете обернуть сайт вызова для этого в какую-либо область... потому что, если бы вы это сделали, переменные, объявленные в этой области, не были бы доступны за ее пределами. Итак, если вы должны были обернуть попытку доступа к индексу в try...catch, чтобы поймать исключение... ваш код не мог продолжаться... потому что будут объявлены вещи, которые не инициализированы. - person Simon Whitehead; 13.12.2013