LINQPad и необработанные исключения - PullRequest
3 голосов
/ 22 сентября 2011

Я пытаюсь завершить работу LINQPad4, используя следующую инструкцию C #:

new Thread(() => new Thread(() => { throw new Exception(); }).Start()).Start();

Отображается необработанное диалоговое окно исключения, но процесс не умирает.Я полагаю, IsTerminating = true, как и во всех исключениях UnhandledThreadException ... как он останавливает процесс от смерти?

Ответы [ 2 ]

5 голосов
/ 22 сентября 2011

также имеется глобальный обработчик исключений для всех исключений, не относящихся к пользовательскому интерфейсу, что-то вроде этого в методе Main:

AppDomain.CurrentDomain.UnhandledException += 
        new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);

Конечно, есть и другие мелочи, плюс, как обычно, попытка / отлов вокруг Application.Run.

См. Полную статью и подробности здесь: Учебник по C # - Работа с необработанными исключениями

Редактировать: hb. попробуйте отладить это:; -)

using System;
using System.Threading;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    static class Program
    {
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);

            AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);

            new Thread(() => new Thread(() => { throw new ApplicationException("Ciao"); }).Start()).Start();

            try
            {
                Application.Run(new Form1());
            }
            catch (Exception exc)
            {
                System.Diagnostics.Debug.WriteLine(exc.Message);
            }
        }

        static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
        {
            // here catching Unhandled Exceptions
            System.Diagnostics.Debug.WriteLine(e.ExceptionObject.ToString());
        }
    }
}
1 голос
/ 21 октября 2011

LINQPad, похоже, не только выполняет свои запросы, но и загружает свои зависимости внутри своего собственного AppDomain.Если вы создадите новый AppDomain в своем приложении, вы сможете дружественно обработать исключения и перезагрузить / скомпилировать приложение дружественным образом.

Еще интереснее то, как LINQPad обрабатывает свои зависимости.По-видимому, они «копируются в тени» при загрузке в эти домены приложений, поскольку у меня есть собственная библиотека, которую я разработал, и я могу вносить в нее изменения «на лету», а LINQPad не блокирует файл;вместо этого кажется, что у него есть FileSystemWatcher, который ищет изменения в файле, выгружает AppDomain, а затем повторно загружает AppDomain с новой зависимостью.

«Пауза» в приложении после построения новогобиблиотека, а затем те новые «методы», которые я добавил, теперь доступны для сценариев через intellisense, что указывает на то, что LINQPad достаточно интеллектуален при работе со сценариями и ссылочными библиотеками, которые: а) не только изменяются;но б) может привести к сбою.

Однако вы всегда можете использовать System.Diagnostics.Debugger.Break (), если вы действительно хотите повеселиться.Если вы отключите оптимизацию своих сценариев в свойствах LINQPad, вы можете фактически выполнить отладку в процессе LINQPad, получить свой исходный код в окне отладчика Visual Studio, разместить точки останова, выполнить шаг, изучить переменные и т. Д., Чтобы фактически выполнить отладку.фрагменты кода, созданные в LINQPad.Это пара дополнительных строк в вашем скрипте, но оно того стоит, если вы выполняете тяжелые сценарии / тестирование в LINQPad.

Это все еще один из лучших инструментов, которые мне удалось найти для создания прототипа модульного теста.и создать код C #, который использует запросы LINQ, которые я могу просто вырезать и вставить в приложения с относительно простым ощущением, что они будут вести себя так, как они наблюдают.

...